我用了模拟,求正解请另寻别处
原来代码很复杂,调试了几次后发现有很多可以删掉的,就修改了一下
i=(i+n-2)%l+1 是由
i=(i+n-1)%l
if( i==0 ) i=l 转成的,怎么转想想就能理解
l 是圈的长度
从k+1(死的都是坏人)枚举n
k 个好人坏人
因为有重复的输入,所以要存一下相同的k的答案
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[ 30 ],k;
int ans[ 20 ];
bool judge( int n )
{
int i,l;
l=k+k;
for( i=k+1;i<=l;i++ ) a[i] = 2;
i=1;
while( l!=k )
{
i=(i+n-2)%l+1;
if( a[i] != 2 )return false;
if( a[i] == 2 ) a[l]=0;
l--;
}
return true;
}
int main()
{
int i;
while( scanf("%d",&k) != EOF )
{
if( k == 0 ) return 0;
if( ans[k] ) {printf("%d\n",ans[k]);continue;}
for( i=k+1; !judge( i ) ;i++ );
ans[k] = i;
printf( "%d\n",i );
}
return 0;
}