• 算法习题---5.6团体队列(Uva540)


    一:题目

    有t个队伍的人正在排队,每次新来一个人,如果他有队友在排队,那他可以插队,直接排到他的队伍的末尾。如果没有队伍在前面,那么他直接排在长队的末尾
    ENQUEUE x       将编号x的队员入队
    DEQUEUE         将队列首个人员出队
    STOP             停止模拟
    对于每一个DEQUEUE操作,都要将出队的人的编号输出

    (一)样例输入

    2
    3 101 102 103
    3 201 202 203
    ENQUEUE 101
    ENQUEUE 201
    ENQUEUE 102
    ENQUEUE 202
    ENQUEUE 103
    ENQUEUE 203
    DEQUEUE
    DEQUEUE
    DEQUEUE
    DEQUEUE
    DEQUEUE
    DEQUEUE
    STOP
    2
    5 259001 259002 259003 259004 259005
    6 260001 260002 260003 260004 260005 260006
    ENQUEUE 259001
    ENQUEUE 260001
    ENQUEUE 259002
    ENQUEUE 259003
    ENQUEUE 259004
    ENQUEUE 259005
    DEQUEUE
    DEQUEUE
    ENQUEUE 260002
    ENQUEUE 260003
    DEQUEUE
    DEQUEUE
    DEQUEUE
    DEQUEUE
    STOP
    0

    (二)样例输出

    Scenario #1
    101
    102
    103
    201
    202
    203
    
    Scenario #2
    259001
    259002
    259003
    259004
    259005
    260001

    二:代码实现

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <map>
    #include <string>
    #include <queue>
    
    using namespace std;
    
    #define MAX 1000    //队列数
    
    int main()
    {
        freopen("data5_6.in", "r", stdin);
        freopen("data5_6.out", "w", stdout);
    
        int num,p_n,p_m,count=1;
        string cmd;
    
        while ((cin >> num)&&num!=0)
        {
            cout << "Scenario #" << count++ << endl;    //输出信息
    
            map<int, int> p_t;    //全部人员信息 队员和队号
        
            //实时排队信息
            queue<int> t_num;    //按顺序保存当前队列中的队列号
            queue<int> p_num[MAX];    //用于保存当前在排队的各个队伍中的人员编号
    
            for (int i = 1; i <= num; i++)    //获取队列信息
            {
                cin >> p_n;
                for (int j = 1; j <= p_n; j++)
                {
                    cin >> p_m;
                    p_t.insert(pair<int, int>(p_m,i-1));
                }
            }
            
            while ((cin >> cmd)&&cmd!="STOP")    //开始进行操作
            {
                if (cmd[0]=='E')    //入队
                {
                    cin >> p_m;    //获取队员编号
                    p_n = p_t[p_m];    //获取队列编号
                    
                    if (p_num[p_n].size() == 0)    //如果当前排队中没有该队伍
                    {
                        t_num.push(p_n);    //将队号一块插入
                        p_num[p_n].push(p_m);
                    }
                    else  //如果当前排队中有该队伍,则直接插入到对应队列中
                        p_num[p_n].push(p_m);
                }
                else if (cmd[0] == 'D')    //出队
                {
                    
                    p_n = t_num.front();    //获取第一个队列号,和该队列中的第一个队员
                    p_m = p_num[p_n].front();
                    p_num[p_n].pop();    //将该队员出队
    
                    cout << p_m << endl;    //输出队员编号
    
                    if (p_num[p_n].size() == 0)    //判断是否是自己队伍中的最后一个人,是的话,将队伍号出队
                        t_num.pop();
                }
            }
    
            cout << endl;    //输出信息 空行
        }
    
        freopen("CON", "r", stdin);
        freopen("CON", "w", stdout);
        return 0;
    }
  • 相关阅读:
    TransactSQL语言 学习sql server2005 step by step(四)
    一步一步学习C#(一)
    SQL实例进阶学习sql server2005 step by step(八)
    SQL Server中常用全局变量和函数 学习sql server2005 step by step(五)
    SQL实例进阶学习sql server2005 step by step(七)
    C#操作excel(开篇)
    SQL进阶提升(平时小积累)学习sql server2005 step by step(十)
    mysql 备份各种方法
    ubuntu 这可怕的弹出窗口啊“Enter password to unlock your login keyring”
    很简单的内核模块A+B
  • 原文地址:https://www.cnblogs.com/ssyfj/p/11514503.html
Copyright © 2020-2023  润新知