• 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;
    }
  • 相关阅读:
    Mybatis中的设计模式
    Mybatis的#{}和${}的区别是什么?
    ES的写入速度优化
    康师傅JVM:垃圾回收相关概念(十六)
    i++为什么不是原子操作?
    Zookeeper的watch机制
    LeetCode 1.两数之和
    ESP 8266 引脚图
    Arduino 将 String 转化为 int
    微擎修改 icon.jpg 后项目主页未变
  • 原文地址:https://www.cnblogs.com/sweetlittlebaby/p/14332725.html
Copyright © 2020-2023  润新知