Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
#include <iostream> #include <stdio.h> #include <queue> #include <algorithm> using namespace std; queue<int> s; void cmp(int k) { int i=1; while(s.front() !=0) //每次从第一个遍历到最后一个 { if(i%k!=0) s.push(s.front() ); //不用被踢下的放在队尾 s.pop() ;i++; } s.pop() ;s.push(0); //把对首的0放在队尾 } int main() { int T,n,i,j,k,l; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=n;i++) s.push(i); s.push(0); i=1; while(s.size() >4) { if(i%2==0) cmp(3); //i的作用是判断报几个数 else cmp(2); i++; } i=0; while(!s.empty() ) { if(s.front() >0) { if(i==1) printf(" "); i=1; printf("%d",s.front() ); } s.pop() ; } printf("\n"); } return 0; }