HDU-1276 士兵队列训练问题(队列)

时间:2021-01-26
本文章向大家介绍HDU-1276 士兵队列训练问题(队列),主要包括HDU-1276 士兵队列训练问题(队列)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

http://acm.hdu.edu.cn/showproblem.php?pid=1276

题意:

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:

从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

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

思路:

两个队列进行循环模拟即可

不断进行循环,直到剩余三个元素为止

代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iomanip>
#include<algorithm>
#include<string.h>
#include<queue>
#include<cmath>

using namespace std;
const int maxn=1e5+10;
const int inf=1e10;
typedef long long ll;

queue<int> q[2];

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        while(!q[0].empty()) q[0].pop();
        while(!q[1].empty()) q[1].pop();

        int n;
        scanf("%d",&n);
        for(int i=1; i<=n; i++) q[0].push(i);

        int i=0;
        int num=0;
        int now=0,pre=1;
        while(!(q[now].size()<4))
        {
            while(!q[pre].empty()) q[pre].pop();
            if(num&1)
            {
                while(!q[now].empty())
                {
                 q[pre].push(q[now].front());
                 q[now].pop();
                 if(q[now].empty()) break;
                 q[pre].push(q[now].front());
                 q[now].pop();
                 if(q[now].empty()) break;
                 q[now].pop();
                }
            }
            else
            {
                while(!q[now].empty())
                {
                    q[pre].push(q[now].front());
                    q[now].pop();
                    if(q[now].empty()) break;
                    q[now].pop();
                }
            }
            num^=1;
            swap(now,pre);
            
        }

        printf("%d",q[now].front());
        q[now].pop();
        while(!q[now].empty())
        {
             printf(" %d",q[now].front());
             q[now].pop();
        }
        printf("\n");
        
    }
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/sweetlittlebaby/p/14332725.html