士兵队列训练问题
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
解题思路:本题属于简单题,没有特殊算法运用,只要照题意依次报数>出列>报数>出列,知道剩下的人不大于3个即可。
1 #include<iostream> 2 using namespace std; 3 int f[5009]; 4 int main() 5 { 6 int t; 7 int n,i; 8 9 while(cin>>t) 10 { 11 while(t--) 12 { 13 cin>>n; 14 for(i=1;i<=n;i++) 15 f[i]=i; 16 int t; 17 if(n<=3) 18 { 19 printf("1"); 20 for(i=2;i<=n;i++) 21 printf(" %d",i); 22 printf("\n"); 23 continue; 24 } 25 while(1) 26 { 27 int leap=0; 28 for(i=1;i<=n;i++) 29 { 30 if(f[i]!=-1) 31 { 32 leap++; 33 } 34 if(leap==2) 35 { 36 leap=0; 37 f[i]=-1; 38 } 39 } 40 t=0; 41 for(i=1;i<=n;i++) 42 if(f[i]!=-1) 43 t++; 44 45 if(t<=3) 46 break; 47 48 leap=0; 49 for(i=1;i<=n;i++) 50 { 51 if(f[i]!=-1) 52 leap++; 53 if(leap==3) 54 { 55 f[i]=-1; 56 leap=0; 57 } 58 } 59 t=0; 60 for(i=1;i<=n;i++) 61 if(f[i]!=-1) 62 t++; 63 if(t<=3) 64 break; 65 66 } 67 for(i=1;i<=n;i++) 68 if(f[i]!=-1) 69 { 70 printf("%d",f[i]); 71 break; 72 } 73 i++; 74 for(;i<=n;i++) 75 if(f[i]!=-1) 76 printf(" %d",f[i]); 77 printf("\n"); 78 } 79 } 80 81 return 0; 82 }