zoukankan      html  css  js  c++  java
  • 解题报告:hdu 1276 士兵队列训练问题

    Problem Description

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

    Input

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

    Output

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

    Sample Input

    2

    20

    40

    Sample Output

    1 7 19

    1 19 37

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <queue>
    
    using namespace std;
    
    int n;
    queue<int> q[2];
    
    void work()
    {
        bool before = 0;
        bool now;
        for(int i = 0; i < n ; i++)
        {
            q[before].push(i+1);
        }
        bool judge = 0;
        while(1)
        {
            now = !before;
            if(q[before].size() <= 3)
            {
                judge = before;
                break;
            }
            int cnt = 0;
            while(!q[before].empty())
            {
                cnt = cnt%2+1;
                if(cnt == 2)
                {
                    q[before].pop();
                }
                else
                    q[now].push(q[before].front()),q[before].pop();
            }
    
            before = now;
            now = !before;
            if(q[before].size() <= 3)
            {
                judge = before;
                break;
            }
            int b = q[before].size();
            cnt = 0;
            while(!q[before].empty())
            {
                cnt = cnt%3+1;
                if(cnt == 3)
                {
                    q[before].pop();
                }
                else
                    q[now].push(q[before].front()),q[before].pop();
            }
            before = now;
    
        }
        bool ff = false;
        while(!q[judge].empty())
        {
            if(ff)
                printf(" ");
            printf("%d",q[judge].front());
            q[judge].pop();
            ff = true;
        }
        printf("
    ");
        return ;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            while(!q[0].empty())
                q[0].pop();
            while(!q[1].empty())
                q[1].pop();
            work();
        }
        return 0;
    }
    
    
  • 相关阅读:
    gateway dblink transport mssql image datatype to oracle blob datatype
    Sql server 数据库备份、恢复等
    sql full left right inner cross 基础
    真的发现自己已不再年轻
    利用日志备份恢复时,提示 该 LSN 太晚,无法应用到数据库
    系统调用原理(转)
    Linux添加自定义系统调用
    libusb 介绍
    用户空间与内核空间数据交换的方式(4)relayfs
    用户空间与内核空间数据交换的方式(2)procfs
  • 原文地址:https://www.cnblogs.com/pprp/p/7819388.html
Copyright © 2011-2022 走看看