题目链接: http://poj.org/problem?id=1012
题意:
有k个坏人k个好人坐成一圈,前k个为好人(编号1~k),后k个为坏人(编号k+1~2k)
现在有一个报数m,从编号为1的人开始报数,报到m的人就要自动死去。
问当m为什么值时,可以使得在出现好人死亡之前,k个坏人先全部死掉?
思路:约瑟夫环的变形问题,前k个退出的人必定是后k个人,所以只要前k轮中只要有一次f(i)<k则此m不符合题意
这里:http://blog.chinaunix.net/uid-26943806-id-3228189.html
有我第一次做这道题时的代码,现在我都没想清楚当时是怎么想出那么复杂的判断条件的。。。
P.S.重新看当时训练赛的情况,这道题好多人都是直接打表过的啊,这不科学!!!
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int ans[15],data[15]; //int data[]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,1245064}; void init () { for (int k=1;k<14;k++) { int m=1; memset(ans,0,sizeof(ans)); for (int i=1;i<=k;i++) { ans[i]=(ans[i-1]+m-1)%(2*k-i+1); if (ans[i]<k) { i=0; m++; } } data[k]=m; } } int main () { int k; init (); while (scanf("%d",&k) , k) printf("%d\n",data[k]); return 0; }