hdu 1276 士兵队列训练问题

来源:互联网 发布:充电桩软件 编辑:程序博客网 时间:2024/05/23 20:51

Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

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

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

Sample Input

2
20
40

Sample Output

1 7 19
1 19 37

Author
Cai Minglun

注意:
必须每一轮都点完,而不是数到只剩三人了就停止,还有注意不要超时。

#include<iostream>using namespace std;int main(){    int n,m;    int s[5005];    cin>>n;    while(n--)    {        cin>>m;        for(int i=1;i<=m;i++)                   //初始化士兵编号           s[i]=i;        int sum=m,a,b;        while(sum>3)        {            a=0,b=0;                           //赋初始值,a统计个数,b负责累加循环             for(int i=1;i<=m;i++)            {                if(s[i])                  b++;                if(b==2)                {                     s[i]=0;                      //排出出队的士兵(即赋值为0)                     a++;                         //负责统计士兵的个数                     b=0;                }            }            sum-=a;                     if(sum<=3)                          //中途判断条件               break;            a=0,b=0;                            //重新筛选,a、b需要初始化             for(int i=1;i<=m;i++)            {                if(s[i])                  b++;                if(b==3)                {                    s[i]=0;                    a++;                                   b=0;                }            }            sum-=a;        }        int cnt=0;        for(int i=1;i<=m;i++)        {            if(s[i])            {                cnt++;                if(cnt!=sum)                  cout<<s[i]<<" ";                else                  cout<<s[i]<<endl;            }        }    }    return 0;}
0 0
原创粉丝点击