队列简易应用

来源:互联网 发布:淘宝女装店铺头像 编辑:程序博客网 时间:2024/05/18 00:00
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
 


 

Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
 


 

Sample Input
22040
 


 


第一次练习队列,见笑。
<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;    }}



0 0