C - 士兵队列训练问题 HDU - 1276
Day3—C
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
思路:直接模拟即可,也可以用队列和栈做,但是我直接模拟了。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; typedef long long ll; void sor(int a[],int k) { int b[5000]; while(k>3) { int i=0,p=0; for(i=0;i<k;i++) { if((i+1)%2!=0) { b[p]=a[i]; p++; } } memset(a,0,sizeof(a)); for(i=0;i<p;i++) a[i]=b[i]; k=(k+1)/2; if(k<=3) break; else { int i=0,p=0; int t=k; for(i=0;i<k;i++) { if((i+1)%3==0) { t--; continue; } b[p]=a[i]; p++; } memset(a,0,sizeof(a)); for(i=0;i<p;i++) a[i]=b[i]; k=t; if(k<=3) break; } } int i; for(i=0;i<k;i++) if (i!=k-1) cout<<a[i]<<" "; else cout<<a[i]<<endl; } int main(void) { int t; cin>>t; while(t--) { int k; cin>>k; int a[5000],i=0; memset(a,0,sizeof(a)); for(i=0;i<k;i++) a[i]=i+1; sor(a,k); } }