约瑟夫环问题小结

    室友的实验报告就是这个题,感觉不亚于CF div2 的 D 题难度。。  虽然它没有时间和空间限定

    首先是约瑟夫环的解法优化  : http://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98

    这也是算导190页的一个练习!

    主要是利用动态规划来降低复杂度

    具体思路如下

    1.把  N 个约瑟夫环 中第一个数到 M步的人(假设编号为 K )剔除掉

    2.那么接下来的问题就是:从  (N-1)个人中找第一个数到M步的人  

    我们把N-1人重新编号(从K+1开始编号),又组成了一个新的N-1 约瑟夫环问题

    那么  假设  在这  N-1 个人中幸存者的编号为  T(序列已改变) 那么它在原序列中的位置应该是(T+M)%N ————这个公式非常重要;

    然后我们就可以根据这个递推, 当 约瑟夫环中只有一个元素的时候,答案为  1 , 所以逆推,就可以求出约瑟夫环为N的时候  幸存者所在的编号 算法复杂度为 O(n)

  

    敢死队问题:

    给定 N ,M ,问你从编号几开始数 编号1 永远是最后一位!  利用循环链表的性质,如果从编号  1 开始数  最后一个出来的编号是  T,那么从 编号2  开始数就是T+1,知道了相对位置,求解此题也就容易了 算法复杂度 为 O(N);

   

没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/3147455.html