别人的思路,有点递归的意思。程序本身超时,但可以利用它来打表。
这个题目其实就是要求前k次踢掉的都是坏人,假设第i次踢掉的人是i,则i>k。根据题意,可以得到如下关系:
设 ai 是第i次踢掉的人在第i-1次踢掉后剩下的人中是第几个。那么
a(n) = [a(n-1)+m-1]mod(2k-n+1)
要求a(n) > k;n = 1,2,3,...,k
其中2k-n+1是第i-1次踢人后剩下的人数
1 bool Joseph(int k, int m) // 这个算法确定对于给定的k,m是否满足上面的要求
2 {
3 int n=0,a=1;
4 for(n=1;n<=k;n++)
5 {
6 a = (a+m-1)%(k*2-n+1);
7 if(a == 0) a = k*2-n+1;
8 if(a<=k && a>=1) return false;
9 }
10 return true;
11 }
Code:
1
#include<iostream>
2
using namespace std;
3
bool judge(int k,int m)
4

{
5
int i,j=1;
6
for(i=1;i<=k;i++)
7
{
8
j=(j+m-1)%(k*2+1-i);
9
if(j==0) j=k*2+1-i;
10
if((j<=k)&&(j>=1))
11
return false;
12
}
13
return true;
14
}
15
int main()
16

{
17
int k,m,i,j,n;
18
while(cin>>k)
19
{
20
if(k==0) break;
21
for(m=k+1;;m++)
22
{
23
if(judge(k,m))
24
{
25
cout<<m<<endl;
26
break;
27
}
28
}
29
}
30
}