2024-10-19 约瑟夫环问题

今天写编程作业的时候,遇到了一个【轮流出列】的问题(助教非常贴心地将m和n的数字设置为了模拟方法刚好可以通过的大小……)。

题目如下:

编号为n的人围成一个圈,轮流从1开始报数,报到m的人出列,然后从下一个人开始继续从1开始报数。求最后剩下的人的编号。

这是一个典型的约瑟夫环问题。

解法为从人数为1开始,逐步递推回人数为n的情况。我们先假设下标从0开始,这样方便后面的计算。当人数为1时,剩下的人的编号显然为0,于是返回1.注意到这一轮中编号0的人,一定是上一轮中编号为m % i的人,所以这一轮中报res的人,在上一轮中的编号为(res + m)% i,我们知道最后一轮中剩下的人一定是编号为0的,这样就可以逐步倒推回此人在第一轮中的编号了(记得要加上1,因为从1开始编号,而我们的推导是从0开始编号)。

代码如下:

def out_queue(n, m):

    res = 0

    for i in range(2, n + 1):

        res = (res + m) % i 

    return res + 1


最后,这个问题的关键在于弄明白这样一个问题:

这一轮中报res的人,在上一轮中的编号是多少?

这样我们知道当最后只剩一个人的时候,若继续报数,则此人一定报0.那么逐渐递推回去,就是这个问题的答案。

        

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的...
    大白猫爱吃鱼阅读 3,783评论 0 1
  • 问题描述 历史典故: 据说著名犹太历史学家 Josephus有过以下的故事: 在罗马人占领乔塔帕特后,39 个犹太...
    neo_ng阅读 3,517评论 0 0
  • 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编...
    xinggang阅读 4,770评论 0 1
  • 编号1~n报数 k 的人死某一阶段的人数 i特殊报数 m 思路 先编号n-1来算,再逆推,记得结果都要+1 f[1...
    ffffffffffffly阅读 3,089评论 0 0
  • 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编...
    穿山甲到底说了什么阅读 5,450评论 0 51

友情链接更多精彩内容