poj 3517 解题思路及报告

    技术2022-05-11  1

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

    问题描述是这样的。。

    有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     --> 0k+1   --> 1k+2   --> 2......k-2   --> n-2k-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

     

    最新回复(0)