说有n个要被处决的人(编号0~(n-1)),从0开始报数,报到(m-1)的会被杀掉,剩下的人继续从0开始报数,如此下去最后剩的一个人会存活下来。说Joseph发现了这个规律而且把他透露了出来,现在假如你在这n个人里面,你会选择几号位置站下。
很显然你会选择能活下来的那个位置,所以问题就是如何得到这个位置。
首先想到的是模拟(至少我笨脑子是这么想的),但无论是用链表还是用数组这个时间复杂度都是比较高的,至少交题的时候会TLE,这里介绍一种线性时间的解法,出自大师Knuth的哦。
考虑下第一次杀人的时候,编号为k = (m - 1) % n的同学挂了,那我们从k + 1重新从0开始编号
k + 1 ==> 0
k + 2 ==> 1
……
……
k - 2 ==> n - 2
k - 1 ==> n - 1
好了,剩余的n - 1个同学又组成了一个新的Joseph环,对新环来说,编号k = (m - 1) % (n - 1)的同学会挂,如此下去,这里面似乎有某种规律可寻。
考虑到不会死的同学一直不会被杀(废话),我们设i个同学时的不会挂的同学的编号(即解)为x,那么当死掉一个同学剩余i - 1个同学的时候,x仍然不会被杀,但此时的x已经由编号变换变成了x’,即x’是i - 1的情况时的解!一直推下去直到i - (i - 1)即1的情况,那1的时候解明显是0嘛!(注意编号是从0开始的),倒推回来,那问题不就解决了么!
好了,分析清楚了剩下的就只是数学推导了,这个我比较烦,直接给公式吧:
向下变换:x’ = (x - (k + 1)) % i;
向上变换:x = (x' + k + 1) % i;
其中: k = (m - 1) % i;
带入可得:x = (x’ + m) % i;
令f[i]表示i个人玩游戏报m退出,最后胜利者的编号自然是f[n],递推公式:
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)
分享到:
相关推荐
非常简单的约瑟夫环算法:用C++语言编译,采用键表功能实现约瑟夫环问题的实现。
从给定的文件信息来看,主要的信息点集中在标题和描述中,即“约瑟夫环实验报告”以及“用vc6.0环境实现的约瑟夫环的上机实验报告”。这部分信息涉及到计算机科学中的一个重要数据结构问题——约瑟夫环(Josephus ...
约瑟夫环(Josephus Problem),也称为约瑟夫环问题,是一个著名的理论问题,源自一个古老的犹太人的传说。在历史背景中,人们站成一个圈,每隔一定人数就会被杀掉,直到只剩最后一个人为止。在计算机科学中,这个...
约瑟夫环-数据结构 joseph.doc 约瑟夫环是数据结构中的一种特殊的循环链表结构,它可以用来解决约瑟夫问题。约瑟夫问题是指:n 个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数),一开始任选一个正整数...
数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和操作数据,以便进行高效的计算。...通过阅读和分析My_Joseph.doc文件,你将能够全面掌握约瑟夫环问题的解决策略,为今后的学习和工作打下坚实的基础。
joseph约瑟夫.砍头函数joseph约瑟夫.砍头函数joseph约瑟夫.砍头函数
【Joseph Link约瑟夫环】是一种著名的算法问题,源自古代犹太历史的一个故事。在这个问题中,人们围成一个圈,按照一定的规则依次报数,每次数到特定数值的人会被剔除出圈,直到只剩下最后一个人。这个算法在数据...
C语言课程设计—约瑟夫环 在本课程设计中,我们将使用C语言解决约瑟夫环问题。...我们使用单循环链表和双向循环链表两种方法来解决约瑟夫环问题,并对LinkList、Joseph和异常处理三个类进行设计和实现。
Joseph环,约瑟夫环,源代码 自己没事写的- -
joseph code约瑟夫环用C++6。0编写。
本程序的主要功能是提供用户从键盘输入,Joseph 约瑟夫环的必要数据,并显示出列顺序,以单向循环链表实现该结构。 关键知识点: 1. 约瑟夫环的定义:约瑟夫环是指一群人围坐在一个圆桌周围,现从第 s 个人开始报...
在`Joseph`函数中,我们实现了约瑟夫环问题的解决方案。首先,我们输入报数上限值`m`,然后使用`while`循环遍历链表。每当`k`等于`m`时,我们输出当前人的编号,并将链表的当前结点删除。最后,我们输出最后一个人的...
在C++实现中,`main`函数作为程序入口,首先接收用户输入的初始密码(m值)和人数(n值),然后调用`EvaluList`创建链表,`ScanList`打印初始状态,最后调用`Joseph`执行约瑟夫环算法并输出结果。 测试数据包括常规...
通过简单的程序解决约瑟夫环问题 c++文件
完成约瑟夫环的c++实现,适合大一c++新学习者借鉴The C + + implementation of Joseph Ring is completed which is suitable for freshmen to learn from
【约瑟夫环问题】是数据结构领域中的一个经典算法问题,源于古罗马数学家约瑟夫的一个故事。在这个问题中,人们围成一个圈,按照顺时针或逆时针顺序报数,每次数到特定数值的人会被排除出圈,然后从下一个人继续报数...
约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是计算机科学中一个著名的理论问题,源于古罗马历史的一个传说。该问题的基本设定是:一群人站成一个圆圈,按照顺时针方向从某个人开始报数,报到特定数值的人将被...
本次课程设计的主题是“约瑟夫Joseph环”,它源自于一个经典的数学问题——约瑟夫环问题,该问题由古罗马历史学家Flavius Josephus提出。在计算机科学领域,约瑟夫环问题常被用来考察数据结构和算法的设计能力,特别...
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到...