别人的思路,有点递归的意思。程序本身超时,但可以利用它来打表。
这个题目其实就是要求前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>
2using namespace std;
3bool 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}
15int 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}