poj 3517 解题思路及报告

其实该题本身算是约瑟环的一个转换。。

问题描述是这样的。。

有n个人,站成一个圆圈。给你两个数k,m。。首先请第m个人出列,然后从m+1开始数数1-k,数到k的人出列,,最后会留下只剩下一个人。让你求出这个人的编号是什么。。

 

第一呢。我们转换下思路。。

先让n个人编号为(0--n-1),编号m-1的人出列。

于是可以得到剩余n-1个人序列。

m m+1 .....n-1 0 1.....m-2

我们也将它编号

m m+1 .....n-1 0 1.....m-2

0  1  .................n-2

于是这个问题便转换成了一个约瑟夫环问题。。问题规模为(n-1)

假如我们知道(n-1)规模问题的解 为编号x,则我们可以根据上述编号对应关系求得n规模问题的解x1=(m+x)%n

当然最后结果呢应该+个1 想必大家都明白 哈哈

关于约瑟夫环的问题可以根据以下求解:

 

问题描述: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     --> 0
k+1   --> 1
k+2   --> 2
...
...
k-2   --> n-2
k-1   --> n-1

变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根
据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x=(x+k)%n

如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。(n-2)个人的解呢?当然是先求(n-3)的
情况 ---- 这显然就是一个倒推问题!

显然得到递推公式

F[0]=0;

F[n]=(F[n-1]+k)%n

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值