说明:有人围成一圈等待处决。计数从圆圈中的某个点开始,并沿固定方向围绕圆圈进行。在每个步骤中,都会跳过一定数量的人并执行下一个人。消除围绕圆圈进行(随着被处决的人被移除,圆圈变得越来越小),直到只剩下最后一个人,他被赋予了自由。我在谷歌上搜索了这个“约瑟夫斯问题”,维基百科的命中给了我一个动态编程解决方案:f(n,k)=((f(n-1,k)+k-1)modn)+1,f(1,k)=1,但这只会产生最后一个幸存者。我怎样才能得到执行的人的顺序?比如说,p(5,3)={3,1,5,2,4}。另外,是否有O(nlogn)解决方案而不是O(nk)解决方案? 最佳答案
约瑟夫问题又称为约瑟夫环,约瑟夫问题有很多变种。本文就以几个经典的约瑟夫问题介绍其几种解法。问题1:鲁智深吃馒头。据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头。智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说:从我开始报数(围成一圈),第5个人可以吃到馒头(并退下);退下的人的下一位开始从1报数,第5个人可以吃到馒头(并退下)……按此方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上,请问他在哪个位置?我们可以使用一个长度为101的数组,并把每一个元素都初始化为0(inta[101]={0};)。用1~100表示99个和尚和鲁智
约瑟夫问题又称为约瑟夫环,约瑟夫问题有很多变种。本文就以几个经典的约瑟夫问题介绍其几种解法。问题1:鲁智深吃馒头。据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头。智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说:从我开始报数(围成一圈),第5个人可以吃到馒头(并退下);退下的人的下一位开始从1报数,第5个人可以吃到馒头(并退下)……按此方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上,请问他在哪个位置?我们可以使用一个长度为101的数组,并把每一个元素都初始化为0(inta[101]={0};)。用1~100表示99个和尚和鲁智
目录一、环形链表1、创建结点 2、添加小结点 3、显示循环链表二、约瑟夫问题 1、问题描述 2、首先确定圈大小及开始位置 3、出圈操作 4、出圈方法完整代码一、环形链表1、创建结点 环形链表其实也很好理解,就是将单链表的头和尾连接起来,就形成了环形链表。publicclassNode{publicintdata;publicNodenext;publicNode(intdata){this.data=data;}@OverridepublicStringtoString(){return"Node{"+"data="+data+'}';}} 2、添加小结点写一个方法用来添加结点,这个方法
目录一、环形链表1、创建结点 2、添加小结点 3、显示循环链表二、约瑟夫问题 1、问题描述 2、首先确定圈大小及开始位置 3、出圈操作 4、出圈方法完整代码一、环形链表1、创建结点 环形链表其实也很好理解,就是将单链表的头和尾连接起来,就形成了环形链表。publicclassNode{publicintdata;publicNodenext;publicNode(intdata){this.data=data;}@OverridepublicStringtoString(){return"Node{"+"data="+data+'}';}} 2、添加小结点写一个方法用来添加结点,这个方法
约瑟夫环问题: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。解法一:利用链表 我们可以把每一个人变成一个链表,然后不断地循环这个链表。每次删除一个结点,直到最终只剩下一个结点的时候就表示我们找到个! //设计一个结点类 classNode{intval;Nodenext;publicNode(in
约瑟夫环问题: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。解法一:利用链表 我们可以把每一个人变成一个链表,然后不断地循环这个链表。每次删除一个结点,直到最终只剩下一个结点的时候就表示我们找到个! //设计一个结点类 classNode{intval;Nodenext;publicNode(in
这篇博客是我在B站看韩顺平老师的数据结构和算法的约瑟夫问题后的学习笔记,记录一下,防止忘记,也希望能帮到各位小伙伴。问题引入:设编号为1,2,…n的n个人围坐一圈,约定编号为k(1提示:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。首先,创建一个小孩类,代码如下://创建一个Boy类,表示一个节点classBoy{ privateintno;//编号 privateBoynext;//指向下一个节点,默认null
这篇博客是我在B站看韩顺平老师的数据结构和算法的约瑟夫问题后的学习笔记,记录一下,防止忘记,也希望能帮到各位小伙伴。问题引入:设编号为1,2,…n的n个人围坐一圈,约定编号为k(1提示:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。首先,创建一个小孩类,代码如下://创建一个Boy类,表示一个节点classBoy{ privateintno;//编号 privateBoynext;//指向下一个节点,默认null
问题描述:30个人在一条船上,超载,需要15人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从1开始,数到9的人下船。如此循环,直到船上仅剩15人为止,问都有哪些编号的人下船了呢? 查看网上的资料都是把人员实例为字典,1代表在船上,0代表下船。网上的实现代码如下:1people={}2forxinrange(1,31):3people[x]=14#print(people)5check=06i=17j=08whilei:9ifi==31:10i=111elifj==15:12break13else:14ifpeople[i]==0:15i+=116continue17else:18