约 瑟 夫 环 问 题 的 三 种 解 法

合集下载

约 瑟 夫 环 问 题 的 三 种 解 法

约 瑟 夫 环 问 题 的 三 种 解 法

约瑟夫环问题python解法约瑟夫环问题:已知n个人(以编号1,2,3.n分别表示)围坐在一张圆桌周围。

从编号为k的人开始报数,数到k的那个人被杀掉;他的下一个人又从1开始报数,数到k的那个人又被杀掉;依此规律重复下去,直到圆桌周围的人只剩最后一个。

思路是:当k是1的时候,存活的是最后一个人,当k=2的时候,构造一个n个元素的循环链表,然后依次杀掉第k个人,留下的最后一个是可以存活的人。

代码如下:class Node():def __init__(self,value,next=None):self.value=valueself.next=nextdef createLink(n):return Falseif n==1:return Node(1)root=Node(1)tmp=rootfor i in range(2,n+1):tmp.next=Node(i)tmp=tmp.nexttmp.next=rootreturn rootdef showLink(root):tmp=rootwhile True:print(tmp.value)tmp=tmp.nextif tmp==None or tmp==root: def josephus(n,k):if k==1:print('survive:',n)root=createLink(n)tmp=rootwhile True:for i in range(k-2):tmp=tmp.nextprint('kill:',tmp.next.value) tmp.next=tmp.next.nexttmp=tmp.nextif tmp.next==tmp:print('survive:',tmp.value)if __name__=='__main__':print('-----------------')josephus(10,2)print('-----------------')josephus(10,1)print('-----------------')输出结果如下:-------------------------------------分界线-----------------------------------------感谢大家建议,第一种方法是直观暴力裸搞,确实不太简洁,下面写出我的第二种方法,求模来搞起,代码少了一些,如下:def josephus(n,k):if k==1:print('survive:',n)people=list(range(1,n+1))while True:if len(people)==1:p=(p+(k-1))%len(people)print('kill:',people[p])del people[p]print('survive:',people[0])if __name__=='__main__':josephus(10,2)josephus(10,1)运行结果和上面一样。

问题归约法

问题归约法

2
3
(122) A
C
B
图 2(a) 移动圆盘 A 和 B 至柱子 2 2. 移动圆盘 C 至柱子 3 的单圆盘问题,如图 2(b)所示.
1
2
3
(122) A
C
B
(322)
1
2
A B
3 C
图 2(b) 移动圆盘 C 至柱子 3 3. 移动圆盘 A 和 B 至柱子 3 的双圆盘问题,如图 2(c)所示.
问题规约法的实质:
从目标(要解决的问题)出发逆向推理,建立子问题以及子问题的子问题,直至最后把初始问题归约为
一个平凡的本原问题集合。 最小的问题或具有明显解答的问题被称为本原问题。
dx 就是一个本原问题,其答案是显而易见的,即 ∫dx=x。
一般地,本原问题是原始问题的子孙问题。因此,问题规约的过程就是在问题空间中不断搜索问题的子 问题和子问题的子问题的过程,直至将原始问题分解为本原问题集合。本原问题的解可以直接得到或通过一 个"黑箱"操作得到。 (2)问题归约表示可由下列 3 部分组成:
一个初始问题描述; 将问题变换为子问题的操作集; 一系列本原问题描述. 问题的归约描述
初始问题集合:初始状态集合 S 算符集合:将问题分解为若干子问题的变换集合 F 本原问题集合:目标状态集合 G 三元组合:(S , F, G) (3)问题规约法与状态空间法
问题归约与前面状态空间描述不同的是,主要其在问题空间中展开对问题的描述和求解。 状态空间法只是研究对问题所陈述的事实\状态如何表示,以及如何搜索状态空间求解;而问题归约法则是 对问题求解中如何将问题逐步分解为一系列子问题\本原问题的集合。 对实际问题求解,可将这两种方法有机结合,如后面讨论到的与或图表示与搜索。 1 与或图的概念 用一个类似图的结构来表示把问题归约为后继问题的替换集合,画出归约问题图。 例:有一个问题 A,它可以通过三种途径来求解: (1)、求解问题 B 和 C (2)、求解问题 D、E 和 F (3)、求解问题 H 这一问题归约为子问题的替换集合关系可由图 4 所示的结构来表示.

约瑟夫环递推推导过程

约瑟夫环递推推导过程

约瑟夫环递推推导过程问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。

求胜利者的编号。

下面利用数学推导,如果能得出一个通式,就可以利用递归、循环等手段解决。

下面给出推导的过程:(1)第一个被删除的数为(m-1)%n;(2)第二论的开始数字为k,那么这n-1个数构成的约瑟夫环为k,k+1,k+2,...k-3,k-2做一个简单映射。

(p(x)=(x-k)%n)k--->0k+1--->1k+2--->2------k-2--->n-2这是一个n-1个人的问题,如果能从n-1个人的问题的解退出n 个人问题的解,从而得到一个递推公式,那么问题就解决了。

假如我们已经知道了n-1个人时,最后胜利者的编号为x,利用映射关系逆推,就可以得出n个人时,胜利者的编号为(x+k)%n。

其中k=m%n。

代入(x+k)%n<=>(x+(m%n))%n<=>(x%n + (m%n)%n)%n<=> (x%n+m%n)%n <=> (x+m)%n(3)第二个被删除的数为(m-1)%n-1(4)假设第三轮的开始数字为o,那这n-2个数构成的约瑟夫环为o,o+1,o+2,...,o-3,o-2。

继续做映射p(x)=(y-o)%(n-2)o--->0o+1--->1o+2--->2------o-2--->n-3这是一个n-2个人的问题。

假设最后胜利者为y,那么n-1个人时,胜利者为(y+o)%(n-1),其中o等于m%(n-1)。

代入可得(y+m)%(n-1)要得到n-1个人问题的解,只需要得到n-2个人问题的解,倒退下去。

只有一个人时,胜利者就是编号0.小面给出递推式:f(1)=0;f(i)=(f[i-1]+m)%i;(i>1)有了递推公式,实现就非常简单了,给出循环的两种实现。

《溪居》《减字木兰花》《省试湘灵鼓瑟》《机女叹》《山雨》等阅读理解答案与赏析

《溪居》《减字木兰花》《省试湘灵鼓瑟》《机女叹》《山雨》等阅读理解答案与赏析

裴度与柳宗元《溪居》阅读答案对比赏析【阅读理解题目】:溪居裴度门径俯清溪,茅檐古木齐。

红尘飘不到,时有水禽啼。

溪居柳宗元久为簪组累①,幸此南夷谪。

闲依农圃邻,偶似山林客。

晓耕翻露草,夜榜响溪石②。

来往不逢人,长歌楚天碧。

[注]①簪组:古代官吏的冠饰。

②榜(péng)进船。

此句意为天黑船归,船触溪石而有声。

(1)“红尘飘不到”、“来往不逢人”两句诗均描写“溪居”生活环境,其相同之处是什么,请简要分析。

(2)两首诗表达的情感同中有异,其不同点是什么?【参考答案】:(1)(4分)两句都有人迹罕至的意思(1分),写出溪居环境的偏远、僻静(2分),表现出诗人远离尘俗的心境(1分)。

(2)(4分)裴诗表达的是亲近自然(1分)的喜悦、悠然自得之情(1分),柳诗表达的是被贬后远离官场(1分)的轻松、聊以自慰之情(1分)。

(或:裴诗表达的是退居山野远离官场亲近自然的自娱自乐之情,是由衷喜爱和闲适;柳诗表达的是谪居山野脱离官场纵情山水的自愚自乐之情,有怡情山水之幸,又心有不甘)【对比赏析】:裴度曾任宰相,并以平淮、蔡功高封晋国公,位高爵显,致招嫉妒.数起数罢.终徙东都留守.他激流勇退,转亲丘壑.《溪居》一首,当为晚年之作.这首诗用欣赏的口吻描绘自己乡间别墅的幽雅环境.诗写得清淡脱俗,格调超逸高古这首诗是柳宗元贬官永州居处冉溪之畔时的作品。

全诗写谪居佳境,苟得自由,独往独来,偷安自幸。

前四句叙述到这里的原因和自己的行径。

后四句叙述自己早晚的行动。

首尾四句隐含有牢骚之意。

秦观、李清照《减字木兰花》阅读答案对比赏析【阅读理解题目】:减字木兰花李清照卖花担上,买得一枝春欲放。

泪染轻匀,犹带彤霞晓露痕。

怕郎猜道,奴面不如花面好。

云鬓斜簪,徒要教郎比并看。

《减字木兰花·卖花担上》是宋代女词人李清照的作品。

此词截取了作者新婚生活的一个侧面,通过买花、赏花、戴花、比花,生动地表现了女主人公天真、爱美情和好胜的脾性,显示了她放纵恣肆的独特个性。

解答分析推理类题目有排除法

解答分析推理类题目有排除法

解答分析推理类题目有排除法、代入法和假设法这三种常用方法,除此之外,常用的方法还有找突破口法和图表法,这两种方法都是直接推理的方法,要重点掌握。

在此,中公教育专家就这两种方法进行讲解。

一、找突破口法找突破口法就是快速找到解题切入点的方法。

通常当题干存在某个比较特殊的条件或者存在某个对象(条件)被反复提及的时候,这个(些)条件往往就是解题的突破口。

找突破口法的解题步骤:第一步,了解背景条件。

通读题干了解题目涉及的元素及题目要求,注意这些元素分类和属性如时间、位置以及数字等限制条件。

第二步,找到隐含条件。

题目中的条件可分成显性条件和隐含条件两种。

显性条件即原文段落已明确给出的条件,而隐含条件是必须通过推理才能得出的条件。

需要对题干显性条件综合、递推和简化从而得到隐含条件。

第三步,推理得出答案。

在挖掘到隐含条件的基础上进行推导,当把所有隐含的条件推出后,答案就可得出。

例题1:甲乙丙丁四人的车分别为白色、银色、蓝色和红色。

在问到他们各自车的颜色时,甲说:“乙的车不是白色。

”乙说:“丙的车是红色的。

”丙说:“丁的车不是蓝色的。

”丁说:“甲、乙、丙三人中有一个人的车是红色的,而且只有这个人说的是实话。

”如果丁说的是实话,那么以下说确的是()。

A.甲的车是白色的,乙的车是银色的B.乙的车是蓝色的,丙的车是红色的C.丙的车是白色的,丁的车是蓝色的D.丁的车是银色的,甲的车是红色的中公解析:首先通过阅读题干容可知要求根据四人所说的话来判断车的颜色的对应关系。

由提问可知丁说的话是实话,即“说实话的人的车是红色的,且甲、乙、丙三人中只有一人说实话”。

再观察甲、乙、丙的话,发现只有乙的话中提到了红色,可以此作为突破口。

显然,乙不可能说实话,否则乙和丙的车都是红色的,不符合题意;则可知丙的车不是红色的,那么丙说的也不是实话,则丁的车是蓝色的。

所以说实话的是甲,甲的车是红色的。

由甲的话“乙的车不是白色”是实话,可知乙的车是银色,则丙的车是白色的。

解动力学问题的思想方法和技巧

解动力学问题的思想方法和技巧

例4、两物体A和B,质量分别为m1和m2,,互相 接触放在光滑水平面上,如图对物体A施以水平
推力,则物体A对物体B的作用力等于。
A、 m1 F
m1 m2
C、F
B、 m2 F
m1 m2
D、mm12 F
FA B m1 m2
解析:把问题推到m1=0,对A和B的作用力就等于F,即
FAB=F符合这一结论的只有选项A和C,又m1→∞时a=0、
过程最为直观。一眼即可看
t
出正确选项为D。
a
0 t
ʋ
0
t
变式练习 如图12所示,真空中相距d=5 cm的两块平行金属板 A、B与电源相接(图中未画出),其中B板接地(电势为零),A板 电势的变化规律如图乙所示.将一个质量m=2.0×10-27 kg,电 荷量q=+1.6×10-19 C的带电粒子从紧邻B板处释放,不计重力. 求:
时,a=0 ,B、D均符合 再把α2推到α2=90。时,a=g
α1 α2
只有D符合故选D。
例7、如图所示,升降机以加速a下降时,质量为m 的物块与斜面相对静止,则物块对斜面的压力为。 A、m(g a)cos B、 m(g a) cos
C、mg cos D、mg(cos sin )
解析:把问题推到a=g,则N=0,
F=0.所以答案C不正确,故选B。
一般用整体法算出加速度,再用隔离法求出A对B的作用力
对整体: F (m1 m2 )a
联立得: FAB
m2 m1 m2
F
对B: FAB m2a
例5、如图所示质量为M的框架放在水平面上,一 个质量为m的圆环沿框架的竖直杆加速下滑,且 与杆的摩擦力为f。则在环下滑过程中框架对地面 的压力的大小为。

解环方程的基本思路和步骤

解环方程的基本思路和步骤

解环方程的基本思路和步骤
解环方程的基本思路和步骤如下:
1. 确定环中的未知数:首先要确定环中的未知数个数,记作n。

2. 列出环方程:根据题目给出的条件,将问题转化为环方程。

环方程是指环中每个未知数与相邻未知数之间的关系。

3. 按照规律列方程:根据环方程的特点,可以逐个列出每个未知数与相邻未知数之间的方程。

常见的规律包括等差数列、等比数列等。

4. 化简方程:对于复杂的方程,可以通过合并同类项、约分、配方等方法,将方程化简为更简单的形式。

5. 解方程:对于简化后的方程,可以使用代入法、整除法、消元法等方法求解未知数的值。

6. 检验解:得到解后,将解代入原方程进行检验,确保得到的解在原方程中成立。

7. 给出解的范围:根据具体题目的要求,给出解的范围或形式。

总体来说,解环方程的关键是找到环中的未知数之间的关系,列出方程,并通过适当的方法求解未知数的值。

教资螺旋答题法

教资螺旋答题法

教师资格证螺旋式答题法,又称为“循环渐进式”答题法,是一种在螺旋式上升过程中不断展开的答题技巧。

这种方法要求在回答问题时,从简单到复杂,从表面到深入,层层递进,使答案更具有逻辑性和深度。

具体来说,螺旋式答题法在教资考试中可以这样运用:
1. 仔细阅读题干:首先需要认真阅读题目,理解题目所问的内容和要求。

2. 列出已知条件:根据题目所给的条件,将已知的、明确的信息罗列出来。

3. 推断未知条件:根据已知条件和自身知识储备,推断出题目中未明确提到的信息。

4. 组织答案:将已知条件和推断出的未知条件组合成完整的答案。

5. 检查答案:检查答案是否符合逻辑,是否满足题目要求,是否有遗漏或错误。

这种答题方法有助于考生在教资考试中更好地组织答案,使答案更有条理、更深入,从而提高答题的效率和准确性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

约瑟夫环问题的简单解法(数学公式法)
关于约瑟夫环问题,无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。

我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。

因此如果要追求效率,就要打破常规,实施一点数学策略。

为了讨论方便,先把问题稍微改变一下,并不影响原意:
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。

求胜利者的编号。

我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 … n-2, n-1, 0, 1, 2, … k-2并且从k开始报0。

现在我们把他们的编号做一下转换:
k-2 – n-2
k-1 – n-1
解x’ —- 解为x
注意x’就是最终的解
变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,
相信大家都可以推出来:x’=(x+k)%n
如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。

(n-2)个人的解呢?当然是先求(n-3)的情况—- 这显然就是一个倒推问题!下面举例说明:
假设现在是6个人(编号从0到5)报数,报到(2-1)的退出,即 m=2。

那么第一次编号为1的人退出圈子,从他之后的人开始算起,序列变为2,3,4,5,0,即问题变成了这5个人报数的问题,将序号做一下转换:
现在假设x为0,1,2,3,4的解,x’设为那么原问题的解(这里注意,2,3,4,5,0的解就是0,1,2,3,4,5的解,因为1出去了,结果还是一个),根据观察发现,x与x’关系为x’=(x+m)%n,因此只要求出x,就可以求x’。

x怎么求出呢?继续推导吧。

0,1,2,3,4,,同样是第二个1出列,变为(2,3,4,0),转换下为
很简单,同样的道理,公式又出来了,x=(x”+m)%5,这里变成5了。

即求n-1个人的问题就是找出n-2的人的解,n-2就是要找出n-3,等等
因此,就可以回去看上面的推导过程了。

好了,思路出来了,下面写递推公式:
令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n]
递推公式
f[i]=(f[i-1]+m)%i; (i1)
有了这个公式,我们要做的就是从1-n顺序算出f[i]的数值,最后结果是f[n]。

因为实际生活中编号总是从1开始,我们输出f[n]+1 由于是逐级递推,不需要保存每个f[i],程序也是异常简单:
#include stdio.h
int main()
int n, m, i, s = 0;
printf ("N M = ");
scanf("%d%d", n, m);
for (i = 2; i = n; i++)
s = (s + m) % i;
printf ("The winner is %d", s+1);
这个算法的时间复杂度为O(n),相对于模拟算法已经有了很大的提高。

算n,m等于一百万,一千万的情况不是问题了。

可见,适当地运用数学策略,不仅可以让编程变得简单,而且往往会成倍地提高算法执行效率。

else {x=(jos(n-1,k)+k)%n;if(x==0)x=n;}
for (int i = 2; i = number; i++) {
System.out.println("出圈的顺序为:");
编号为4的人又从1开始报数,这时编号为4的人是这个队伍的头,则第二轮死去的人是6号。

50 public int PlayNum { get; set; }-*每次游戏丢PlayNum 次手绢*-
又假设关键数(要数的那个数)m=3,那么第一轮出局的将会是表头下一个的下一个(表头的第三个),如图所示:
std::cout"The link is must be longer than 1"endl;
约瑟夫环问题:已知n个人(以编号1,2,3.n分别表示)围坐在一张圆桌周围。

从编号为k的人开始报数,数到k的那个人被杀掉;他的下一个人又从1开始报数,数到k的那个人又被杀掉;依此规律重复下去,直到圆桌周围的人只剩最后一个。

--总共有13人,从第1位开始报数,每隔两位踢出1个。

?
{f(1)=0f(n)=(f(n?1)+m)%nbegin{cases}f(1) = 0f(n) = (f(n-1)+m)%nend{cases}{f(1)=0f(n)=(f(n?1)+m)%n?。

相关文档
最新文档