题目描述 n个人排成一圈,按顺时针方向依次编号1,2,3…n。从编号为1的人开始顺时针"一二三...."报数,报到m的人退出圈子。这样不断循环下去,圈子里的人将不断减少。最终一定会剩下一个人。试问最后剩下的人的编号。 本题的数据规模更具有挑战性,尝试更通用且高效的算法。 输入 不超过1000组数据。 每组数据一行,每行两个正整数,代表人数n (1 <= n < 231)和m(1<=m<=1000)。 输出 每组输入数据输出一行, 仅包含一个整数,代表最后剩下的人的编号。 样例输入 Copy 7 2 2 2 样例输出 Copy 7 1
时间: 2024-04-21 19:28:28 浏览: 128
有N个人围成一环形圈,第一个人从1开始报数,报道M的人出列,直到最后一个同学,请写出算法。.txt
这道题可以使用数学方法解决,不需要模拟整个过程。具体来说,我们可以从最后一轮游戏开始,设剩下的人的编号为f(n,m)。显然,在最后一轮游戏中,第一个出圈的人的编号是(m-1)%n+1,记为k。那么,剩下的n-1个人中,下一轮游戏编号为k+1,k+2,...,n,1,2,...k-2,k-1,相当于把原来的编号整体向左移动了k个位置。因此,剩下的人的编号是f(n-1,m),但是这个编号是相对于移动后的编号的,要转换为相对于原来的编号,需要加上k。因此,f(n,m)=(f(n-1,m)+k)%n。
最终,当n=1时,剩下的人的编号就是1。因此,我们可以使用递归的方法来计算f(n,m)。时间复杂度为O(n),可以通过本题。下面是AC代码:
阅读全文