某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
水题
1 #include <iostream> 2 3 using namespace std; 4 #include<stack> 5 #include<stdio.h> 6 #include<math.h> 7 #include<string.h> 8 #include<map> 9 #include<queue> 10 int main() 11 { 12 int t,a[5010],n,i; 13 cin>>t; 14 while(t--) 15 { 16 cin>>n; 17 if(n==1) 18 { 19 cout<<"1"<<endl; 20 continue; 21 } 22 if(n==2) 23 { 24 cout<<"1 2"<<endl; 25 continue; 26 } 27 if(n==3) 28 { 29 cout<<"1 2 3"<<endl; 30 continue; 31 } 32 for(i=1;i<=n;i++) 33 a[i]=1; 34 int sum=10086; 35 int add; 36 while(sum>3) 37 { 38 add=0; 39 sum=0; 40 for(i=1;i<=n;i++) 41 { 42 if(a[i]==1) 43 { 44 add++; 45 if(add%2==0) 46 { 47 a[i]--; 48 //cout<<i<<"****"<<add<<endl; 49 } 50 } 51 } 52 for(i=1;i<=n;i++) 53 { 54 if(a[i]==1) 55 sum++; 56 } 57 if(sum<=3) 58 break; 59 add=0; 60 sum=0; 61 for(i=1;i<=n;i++) 62 { 63 if(a[i]==1) 64 { 65 add++; 66 if(add%3==0) 67 { 68 a[i]--; 69 //cout<<i<<"****"<<add<<endl; 70 } 71 } 72 } 73 for(i=1;i<=n;i++) 74 { 75 if(a[i]==1) 76 sum++; 77 } 78 if(sum<=3) 79 break; 80 } 81 int flag=1; 82 for(i=1;i<=n;i++) 83 { 84 if(a[i]==1) 85 { 86 if(flag) 87 { 88 flag=0; 89 cout<<i; 90 continue; 91 } 92 cout<<' '<<i; 93 } 94 } 95 cout<<endl; 96 } 97 return 0; 98 }