室友的实验报告就是这个题,感觉不亚于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);