码迷,mamicode.com
首页 > 其他好文 > 详细

123212

时间:2018-07-03 22:27:26      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:要求   body   方式   约瑟夫   通过   流程   历史   世纪   利用   

1. 一个杀人游戏

这个问题是以弗拉维奥?约瑟夫命名的,它是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。约瑟夫斯和另外一个人是最后两个留下的人。约瑟夫斯说服了那个人,他们将向罗马军队投降,不再自杀。约瑟夫斯把他的存活归因于运气或天意,他不知道是哪一个。[1]

2. 数学解法一

传统解法为循环链表模拟出队流程,详见[1]。这里讨论更高效的数学解法。

要求解的是最后剩下的人的编号。解决思路是如果将杀人后的环重新编号,可以让求解的问题仍与杀人前等价,但问题规模(人数n)却可以减小 1,这样只要找到杀人前后新旧编号的递推关系,就可以利用规模为 1 时最后剩下人的编号一定为 0 的特点,反推回更大问题规模时的编号。


囚犯个数为 n,每次杀掉第 m 个人,囚犯编号从 0 到 n - 1。

从 0 开始编号是为了下面公式中求余情况简单,不然如从 1 开始编号,当对 n 求余为 0 时要特殊修正为 n,在求解出
编号后可以通过加 1 恢复成常见的从 1 开始编号方式

如规模为 n 时某个人 X,对应编号记为 Xn ,规模变为 n - 1 时,从被杀的那个人后重新编号,X 的新编号为 Xn - 1

可以通过下面的例子看出 Xn - 1 与 Xn 相差为被杀的那个人编号加 1,即 m % n, 但考虑 Xn - 1 + m % n 后可能超过 n,因此最终关系为 Xn = (Xn - 1 + m % n) % n,根据同余性质 [2] ,等价为 Xn = (Xn - 1 % n + m % n) % n,等价为 Xn = (Xn - 1 + m) % n


对于 n = 5, m = 8

Xn 0 1 2 3 4
杀人后 0 1 被杀 3 4
Xn - 1 2 3 0 1

123212

标签:要求   body   方式   约瑟夫   通过   流程   历史   世纪   利用   

原文地址:https://www.cnblogs.com/dujianfeng/p/9260797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!