HDU 1276 士兵队列训练问题

来源:互联网 发布:mac vscode c语言 编辑:程序博客网 时间:2024/06/01 09:34

Description

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

Input

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

Output

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

Sample Input

22040
               

Sample Output

1 7 191 19 37
题意:
n个士兵按1~n的顺序排好,首先从左到右报数,1~2交替,报到2的出队,然后再从左到右1~3交替报数,报到3的出队,循环这两个过程,直到队列的人数<=3为止。最后输出剩下人的最初编号。
思路:
直接模拟着两个过程,直到人数<=3为止,最后输出结果。
代码:
#include<cstdio>int a[5001];//using namespace std;int main(){    int N,x,b,c;    scanf("%d",&N);    while(N--)    {        scanf("%d",&x);        b=x;        for(int i=1;i<=x;i++)            a[i]=i;            while(b>3)            {                c=0;            for(int i=1;i<=x;i++)            {               if(a[i]==0)   continue;               else c+=1;               if(c==2)               {                   a[i]=0;                   c=0;               }            }            b=b-b/2;            if(b<=3)   break;            c=0;            for(int i=1;i<=x;i++)            {                if(a[i]==0)   continue;                else c+=1;                if(c==3)                {                   a[i]=0;                   c=0;                }            }             b=b-b/3;            }            c=0;            for(int i=1;i<=x;i++)            {                if(a[i]==0)   continue;                else                {                    c+=1;                    if(c==b)                        printf("%d\n",a[i]);                    else                        printf("%d ",a[i]);                }            }    }  return 0;}

 

0 0
原创粉丝点击