士兵队列训练问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4558 Accepted Submission(s): 2125
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
注意最后的输出不一定是三个数 少于等于3就行
#include<stdio.h> #include<string.h> #define MAX 11000 int main() { int t,n,m,i,j,k; int set[MAX],a[MAX],b[MAX]; scanf("%d",&t); while(t--) { memset(set,0,sizeof(set)); scanf("%d",&n); if(n==1) { printf("1\n"); continue; } else if(n==2) { printf("1 2\n"); continue; } else if(n==3) { printf("1 2 3\n"); continue; } for(i=1;i<=n;i++) { set[i]=i; } int l=1,ok=n; while(1) { if(l&1) { k=0; memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { if(i%2!=0) { a[++k]=set[i]; } else { --ok; } } //printf("%d\n",k); n=ok; memset(set,0,sizeof(set)); for(i=1;i<=k;i++) { set[i]=a[i]; } } else { m=0; memset(b,0,sizeof(b)); for(i=1;i<=n;i++) { if(i%3==0) { --ok; continue; } b[++m]=set[i]; } n=ok; //printf("%d#\n",m); memset(set,0,sizeof(set)); for(i=1;i<=m;i++) { set[i]=b[i]; } } l++; if(n<=3) break; } if(k<m) { for(i=1;i<=k;i++) { if(i==1) printf("%d",a[i]); else printf(" %d",a[i]); } printf("\n"); } else if(m<k) { for(i=1;i<=m;i++) { if(i==1) printf("%d",b[i]); else printf(" %d",b[i]); } printf("\n"); } } return 0; }
时间: 2024-12-29 15:53:29