• 解题报告: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;
    }
    
    
  • 相关阅读:
    JavaWeb:ServletRequestListener
    JavaWeb:HttpServletRequestWrapper
    JavaWeb:Filter
    JavaWeb:HttpSession
    对APS的简单了解
    rem,px,em最大的区别;
    使用vue-cli构建工具构建vue项目时候组件的使用
    webpack 4.0 配置方法以及错误解决
    px,rem,em 通过媒体查询统一的代码
    关于页面中css某些情况下出现不知原因的隔断解决办法
  • 原文地址:https://www.cnblogs.com/pprp/p/7819388.html
Copyright © 2020-2023  润新知