题目
有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么这个新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会排到长队的队尾。输入要求支持如下指令:
ENQUEUE x y:x团队编号为y的人进入长队。
DEQUEUE:长队的队首出队。
STOP:停止模拟
对于每个DEQUEUE指令,输出出队的人的编号。
【输入】输入数据包含多个测试样例,输入的每个样例第一行为团队数t(1<=t<=10),团队编号为1…t,接着的每行输入操作指令。当输入指令为STOP时,结束该样例的模拟。当输入样例的团队数t为0时,结束输入,无需担心指令出错。
【输出】对于每一个测试样例,输出“Scenario #k”。接着,对每一条DEQUEUE指令,输出出队的人的编号。每个测试样例以一个空白行隔开(包括最后一个测试样例)
例如:
【输入】
2
ENQUEUE 1 101
ENQUEUE 2 201
ENQUEUE 1 102
ENQUEUE 2 202
ENQUEUE 1 103
ENQUEUE 2 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
2
ENQUEUE 1 101
ENQUEUE 2 201
ENQUEUE 1 102
ENQUEUE 1 103
ENQUEUE 1 104
ENQUEUE 1 105
DEQUEUE
DEQUEUE
ENQUEUE 2 202
ENQUEUE 2 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
【输出】
Scenario #1
101
102
103
201
202
203
Scenario #2
101
102
103
104
105
201
分析
简单来说,排队时如果发现前边有自己团队的人,就可以插在自己队的最后;否则就在整个队伍的最后。
- T的作用:为0时结束程序,while(cin >> T && T);
- 用两个队列,分别存放队与队员,即 q,que,key为队,value为队员,q放队,que放队员,用 que[i] 来表示每队队员。
- 对于命令DEQUEUE,ENQUEUE和STOP,用command数组存入,仅判断command[0]即可。
- 输出时,q和que不能同时弹出,例如 1 1 2 1,que[1]弹出3个,若是q也弹出3个,那会把2错弹掉。所以这里的措施是,只弹出que,而后对q做判断。
- 输出判断:例如 1 1 2 2 1 1 3 3,此时只弹出que[1]全部,而q不作处理。当que[1]为empty时,将在前列的q为1的值全部弹出。然而后边的1仍有影响,会对新来的成员产生在前侧的错觉,还会插在3的前边。所以在 团队为空,来新成员,但q中因为需要顺序弹出仍存在团队数 的情况做处理,方法是bool判断。
- 需要注意:队伍全部出掉后要清除q中的数据,并且分开队伍最开始进人和团队没人,进新成员的情况。
代码
#include <iostream>
#include <queue>
//#include <map>
using namespace std;
const int maxt=11;
//我的评价是,开大点
int main()
{
int T,m