zoukankan      html  css  js  c++  java
  • 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("
    ");
            
        }
        system("pause");
        return 0;
    }
  • 相关阅读:
    firewall-cmd常用命令
    centos7添加硬盘扩展根分区
    win11拖动窗口造成崩溃的问题
    JedisCluster支持pipeline管道
    Docker
    Nginx入门
    【ElasticSearch】精确匹配text字段 用match加.keyword 或 term
    Enum<E extends Enum<E>>
    【配置】jdk8和jdk11切换
    【ElasticSearch】script中进行比较,date类型转为long型
  • 原文地址:https://www.cnblogs.com/sweetlittlebaby/p/14332725.html
Copyright © 2011-2022 走看看