Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
我的算法与程序#include <iostream> using namespace std ; int main () { int n , m , k , i ; while (scanf ("%d" , &n) != EOF && n) { for (m=1 ; ; ++m) { k = 0 ; for (i=2 ; i<=n-1 ; ++i) k = (k + m) % i ; if (! k) { printf ("%d\n" , m) ; break ; } } } return 0 ; } 我来简单地讲一下这道题目。 了解约瑟夫问题的人一定知道,知道了有 n 个人(0,1,...(n-1)),数的数字为 m (从0开始数,数到 (m-1) 者杀死,下一个人再从 0 开始数)我们可以用一个 O(N) 的递推算法计算出如果有 n 个人的话,最后一个死的人是谁 : F[1] = 0 F[i] = (F[i-1] + m) % i (i > 1) 这题我们可以通过从小到大枚举 m , 来求得解。 有一个小 Trick :刚开始的时候 1 号城 cut 了,这实际上就是表示从 2 号城开始计数。所以这里的 2 号城就是经典问题里面的 0 号城。因此,我的程序最后只需要判断 k 是否为 0 即可。 程序跑了 16 ms …… 不过当 n = 6000 ,程序就要用 1s 多的时间了。 Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator