一群猴子要选大王,遴选的方法是:让m只候选猴子围成一圈,从某位置起顺序编号为0∼m−1号。从第0号开始报n个数字,每轮从0报到n−1,凡报到n−1的猴子即退出候选,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。问猴王是原来第几号猴子?
时间: 2023-05-31 09:20:48 浏览: 174
c++实现猴子选大王
### 回答1:
这是一个关于选择大王的问题。选择的方法是让m只猴子围成一个圈,从某位置起顺序编号为0~m-1。从编号为0的位置开始报n个数字,每轮报到n-1的猴子退出,直到只剩下一只猴子时即为选择的猴王。接着从紧邻被删除的下一只猴子开始按同样的方式继续报数,直到只剩下一只猴子。询问的是猴王是原来第几号猴子。
### 回答2:
这是一个经典的约瑟夫问题,可以用数学归纳法来证明猴王是原来第$(m-1)\bmod n$号猴子。
首先考虑$m=1$的情况,此时只有一只猴子,那么它就是猴王,编号为0,符合结论。
接着考虑$m>1$的情况,假设$m-1$只猴子中选出的猴王的编号是$k$,我们需要证明从这$m-1$只猴子中再加入一只猴子后,选出的猴王的编号是$(k+n)\bmod m$。
首先进行报数的时候,相当于从$k$开始,报到$(k+n-1)\bmod(m-1)$的猴子出圈,它的编号是$(k+n-1)\bmod(m-1)$,此时编号大于等于$k$的猴子编号要加1。
然后从$(k+n)\bmod(m-1)$开始重新报数,这时编号小于$k$的猴子编号不变,其他猴子的编号要加1。这个过程中,我们可以把原来的猴子编号看做是$(k+0)\bmod(m-1)$到$(k+m-2)\bmod(m-1)$,只需找到新加入的猴子在这个序列中的位置即可得到猴王的新编号。
设$(k+n)\bmod(m-1)=p$,则新加入的猴子编号为$p$,根据定义可以得到它在第一轮游戏中被淘汰。此时还剩下$m-2$只猴子,猴王的编号是$k$,根据归纳假设,选出的猴王的编号是$(k+n)\bmod(m-1)$,即$p$。所以最后选出的猴王的编号就是$p=(k+n)\bmod m$,证毕。
### 回答3:
这是一道经典的约瑟夫环问题。我们可以使用递推的方法解决。
我们定义f(i)表示i只猴子中最后留下的猴子的编号。那么最终的答案即为f(m)。
首先,当只有一只猴子时,它就是猴王,即f(1)=0。
然后,我们考虑有i只猴子时最后留下的是哪一只猴子。我们可以把它们依次编号为0 ~ i-1。考虑在i只猴子中,最后退出的猴子编号为x,那么在i+1只猴子中,最后退出的猴子编号一定为(x+n)%i+1,即在i只猴子中往后数n次的猴子在i+1只猴子中的编号。
因此,我们可以得到递推公式:
f(1) = 0
f(i) = (f(i-1) + n) % i, i > 1
最终的答案即为f(m)。
例如,当m=5,n=3时,我们可以递推得到:
f(1) = 0
f(2) = (f(1) + 3) % 2 = 1
f(3) = (f(2) + 3) % 3 = 1
f(4) = (f(3) + 3) % 4 = 0
f(5) = (f(4) + 3) % 5 = 4
因此,最后留下的猴子是原来第4只猴子。
阅读全文