一:题目

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

(一)样例输入


ENQUEUE
ENQUEUE
ENQUEUE
ENQUEUE
ENQUEUE
ENQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP ENQUEUE
ENQUEUE
ENQUEUE
ENQUEUE
ENQUEUE
ENQUEUE
DEQUEUE
DEQUEUE
ENQUEUE
ENQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP

(二)样例输出

Scenario #

Scenario #

二:代码实现

#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=;
string cmd; while ((cin >> num)&&num!=)
{
cout << "Scenario #" << count++ << endl; //输出信息

map<int, int> p_t; //全部人员信息 队员和队号 //实时排队信息
queue<int> t_num; //按顺序保存当前队列中的队列号
queue<int> p_num[MAX]; //用于保存当前在排队的各个队伍中的人员编号
for (int i = ; i <= num; i++) //获取队列信息
{
cin >> p_n;
for (int j = ; j <= p_n; j++)
{
cin >> p_m;
p_t.insert(pair<int, int>(p_m,i-));
}
} while ((cin >> cmd)&&cmd!="STOP") //开始进行操作
{
if (cmd[]=='E') //入队
{
cin >> p_m; //获取队员编号
p_n = p_t[p_m]; //获取队列编号 if (p_num[p_n].size() == ) //如果当前排队中没有该队伍
{
t_num.push(p_n); //将队号一块插入
p_num[p_n].push(p_m);
}
else //如果当前排队中有该队伍,则直接插入到对应队列中
p_num[p_n].push(p_m);
}
else if (cmd[] == '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() == ) //判断是否是自己队伍中的最后一个人,是的话,将队伍号出队
t_num.pop();
}
} cout << endl; //输出信息 空行
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
return ;
}
05-24 09:09