HDU 1276 士兵队列训练问题

来源:互联网 发布:广州sd卡数据恢复 编辑:程序博客网 时间:2024/06/05 03:44

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

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

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

Sample Input
2
20
40

Sample Output
1 7 19
1 19 37

简单模拟题,按要求做就行了。
需要注意的是题意是报到能被2或3整除的数出队,而不是尾数是2或3的出队。

#include <cstdio>#include <cstring>using namespace std;const int maxn = 5005;int a[maxn];int main(int argc, char const *argv[]){    int N;    scanf("%d",&N);    while(N--)    {        int n;        scanf("%d",&n);        memset(a,-1,sizeof(a));        for(int i = 1;i <= n;i++)            a[i] = i;        int flag = 1,temp = n;        while(n > 3)        {            if(flag)            {                for(int i = 1;i <= temp;i++)                    if(a[i] != -1 && a[i]%2 == 0)                    {                        a[i] = -1;                        n--;                    }                flag = 0;            }            else            {                for(int i = 1;i <= temp;i++)                    if(a[i] != -1 && a[i]%3 == 0)                    {                        a[i] = -1;                        n--;                    }                flag = 1;            }            for(int i = 1,j = 1;i <= temp;i++)            {                if(a[i] != -1)                    a[i] = j++;            }        }        int first = 1;        for(int i = 1;i <= temp;i++)            if(a[i] != -1)            {                if(first)                {                    printf("%d",i);                    first = 0;                }                else                    printf(" %d",i);            }        printf("\n");    }    return 0;}
0 0