Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
第一次练习队列,见笑。<pre name="code" class="cpp">#include <iostream> #include <queue> using namespace std; int left(int guy,int left_guys[5],int &num_left) { //算出guy int ji_ou_bao=1,temp; queue <int>soldier; for(int i=1;i<=guy;i++) { soldier.push(i); } while(soldier.size()>3) { temp=soldier.size(); if(ji_ou_bao%2==1) { for(int j=1;j<=temp;j++) { if(j%2==0) { soldier.pop(); } else { soldier.push(soldier.front()); soldier.pop(); } } } else { for(int j=1;j<=temp;j++) { if(j%3==0) { soldier.pop(); } else { soldier.push(soldier.front()); soldier.pop(); } } } ji_ou_bao++; } ji_ou_bao=0; //充当一般常数 num_left=soldier.size(); while(!soldier.empty()) { left_guys[ji_ou_bao]=soldier.front(); soldier.pop(); ji_ou_bao++; } } int main() { int n,guys[20],left_guys[5],num_left; cin>>n; for(int i=0;i<n;i++)cin>>guys[i]; //carry out the function(guys[i],left_guys,num_left); for(int i=0;i<n;i++) { left(guys[i],left_guys,num_left); for(int j=0;j<num_left;j++) { cout<<left_guys[j]<<" "; } cout<<endl; } }