永发信息网

c++敢死队

答案:1  悬赏:40  手机版
解决时间 2021-02-08 23:39
  • 提问者网友:我没有何以琛的痴心不悔
  • 2021-02-08 18:58
有M个敢死队员要炸掉敌人的一碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。
如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,
当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。
如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。以此类推,直到任务完成为止。
排长是不愿意去的,假设排长为1号,请你设计一程序,求出从第几号战士开始计数才能让排长最后一个留下来而不去执行任务。
要求:至少采用两种不同的数据结构的方法实现。
最佳答案
  • 五星知识达人网友:深街酒徒
  • 2021-02-08 20:29
这是个约瑟夫环逆问题
推导是这样的:

为了讨论方便,先把问题稍微改变一下,并不影响原意:
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。
我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):
k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2
并且从k开始报0。
现在我们把他们的编号做一下转换:
k --> 0
k+1 --> 1
k+2 --> 2
...
n-1 --> n-k-1
0 --> n-k
....
k-2 --> n-2
k-1 --> n-1
变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,可以推出来:x'=(x+k)%n=(x+m%n)%n = (x+m)%n.

那么有了这个递推公式,是否可以求出J的形式化表示?目前看来,除了m=2的情况,答案是否定的。Knuth给出了m=2的形式化描述:设 n = 2^i + l 则 J(n,2) = 2l+1。 这个公式的证明比较巧妙,考虑到如果n=2^i, 则1会永远保持1号位,也就是最后的x=1。那么对于n = 2^i + l 的情况,只要先出局l个数,剩下的数就是2^i的情况,此时永远保持1号位的就是2l+1。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯