标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1963 Accepted Submission(s): 1194
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define maxn 300 5 6 struct Node{ 7 int v;//存入点的编号 8 int next; 9 }nd[maxn]; 10 11 int main() 12 { 13 int n, k; 14 while(cin >> n >> k) 15 { 16 for(int i = 0; i < n; i++) 17 nd[i].v = i, nd[i].next = i+1; 18 nd[n-1].next = 0; 19 20 int cur = 0; 21 for(int i = 0; i < n-1; i++) 22 { 23 for(int j = 1; j < k-1; j++) cur = nd[cur].next; 24 int dnd = nd[cur].next;//要被删除的结点的编号 25 nd[cur].next = nd[dnd].next; 26 for(int j = cur, c = 0; c < (n-i-1); c++, j = nd[j].next) printf("%d ", nd[j].v); puts("");//输出每次剔除人后的环 27 } 28 } 29 return 0; 30 }
1 int f(int n,int m) 2 { 3 if(n==1) return 0; 4 else return ((n%m)+f(n-1,m))%n; 5 }
但是这个题要求是前K 步都要不去除好人所以要统计每次去除的人在原先的编号是多少,
1 int f(int n , int m , int t)//n 个人 每m 个人提出,第t次去除的是编号为几的人(人的编号从0到n-1) 2 { 3 if(t==1) return (m-1)%n; 4 return (m%n+f(n-1,m,t-1))%n; 5 }
下面是ac代码
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int f(int n , int m , int t) 5 { 6 if(t==1) return (m-1)%n; 7 else return (m%n+f(n-1,m,t-1))%n; 8 }//n个人,报数到m出列,第t轮出列的人的编号 从0到n-1编号 9 int res[15]; 10 int main() 11 { 12 int n , m , k; 13 for(int k = 1 ; k <= 13 ;k++) 14 { 15 int n = 2*k; 16 for(m = k+1 ; ; m++) 17 { 18 int flag = 1; 19 for(int i = 1 ; i <= k ; i++) 20 { 21 int cnt = f(n,m ,i); 22 if(cnt>=0&&cnt<k) 23 { 24 flag = 0; 25 break; 26 } 27 } 28 if(flag ) break ;//找到最小的了就不再搜索 29 } 30 res[k] = m; 31 } 32 while(~scanf("%d",&k),k) 33 { 34 printf("%d\n",res[k]); 35 } 36 return 0; 37 }
标签:
原文地址:http://www.cnblogs.com/shanyr/p/4674212.html