一:题目
有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;
}