算法习题---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;
}

猜你喜欢

转载自www.cnblogs.com/ssyfj/p/11514503.html