题目链接: 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;
}