约瑟夫问题 mark
来源:互联网 发布:武汉最新网络约车新规 编辑:程序博客网 时间:2024/06/14 15:02
把问题重新描述一下:N个人(编号0~(N-1)),从0开始报数,报到(M-1)的自杀,剩下的人继续从0开始报数。求最后自杀者的编号。
N个人编号如下:
第一个自杀的人是(M-1)%N,例如上图中,41个人中,报到3的人自杀,则字一个自杀的人的编号是(3-1)%41=2。编号(M-1)%N自杀后,剩下的人排列如下:
有人自杀后,下一个位置M又从零开始报数,因此环应该如下:
将上面的排列顺序重新编号:
问题变为(N-1)个人,报到为(M-1)的人自杀,问题规模减小了。这样一直进行下去,最后剩下编号为0的人。用函数表示:
F(1)=0
当有2个人的时候(N=2),报道(M-1)的人自杀,最后自杀的人是谁?应该是在只有一个人时,报数时得到的最后自杀的序号加上M,因为报到M-1的人已经自杀,只剩下2个人,另一个自杀者就是最后自杀者,用函数表示:
F(2)=F(1)+M
可以得到递推公式:
F(i)=F(i-1)+M
因为可能会超出总人数范围,所以要求模
F(i)=(F(i-1)+M)%i
有了递推公式就可以在O(N)时间求出结果:
0 0
- 约瑟夫问题 mark
- 约瑟夫问题、约瑟夫环
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- STL之set
- 2017.3.18【NOIP提高组】模拟赛B组 T1:人类基因组
- Spark下的word2vec模型训练
- 数组中出现次数超过一半的数
- JavaSE基础之枚举的使用
- 约瑟夫问题 mark
- 配置Sublime Text3编译汇编并高亮代码
- 【数据结构_树_Tree_0982】利用二叉树储存普通树的度
- 就地逆置带头结点的单链表
- DXP中关于PCB及原理绘制那些高级玩意总结
- 《C++ primer plus》第十四章:C++的代码重用 学习笔记
- Spark分析之BlockManager
- 第五章 语句
- L1-010. 比较大小