最开始老想着定义一个数组arr[28]来存放2*k个人的状态,每kill掉一个人给arr[i]赋值0,没被kill掉的为1,结果这是自找麻烦,增大了复杂程度。
优化后的思路是:没kill掉一个人,就直接让总人数减一,让kill掉后的人数的序号都减一,不用管细节上的谁被kill掉了。
为了优化:注意m一定是k+1的倍数,或其倍数加1。
代码如下:
#include<stdio.h>
int brr[15]={0};
int k,m;
int num;
int test(int a);
int main()
{
int i,j;
brr[1]=2;
for(i=2;i<14;i++)
{
k=i;
for(j=1;;j++)
{ num=2*k;
m=j*(k+1);
if(test(m)==1)
{
brr[k]=m;break;
}
num=2*k;
m=j*(k+1)+1;
if(test(m)==1)
{
brr[k]=m;break;
}
}
}
while(~scanf("%d",&k))
{
if(k==0)break;
printf("%d\n",brr[k]);
}
return 0;
}
int test(int a)
{
int b;
b=(a-1)%num;
if(b<k)return 0;
num--;
while(1)
{
b=(b-1+a)%num;
if(b<k)return 0;
num--;
if(num==k)break;
}
return 1;
}