题目大意:每个样例都有n支队伍,每支队伍有mi(i=1...n)个队员,编号是xi1,xi2,xi3。ENQUEUE x代表x进行排队,排队方式为,如果排队长列中有自己队伍的队员,自己则排在自己队伍的后面,否则自己排在长列的最后(成为之后自己队伍中队员排队的头)。DEQUEUE代表长列第一位出列。STOP代表一次样例结束。
解题思路:定义两个队列,一个队列是每支队伍在长列中的顺序,另一个队列是代表长列,代表长列的定义为队列数组,数组按编号与每支队伍在长列中的顺序一致。用map来将编号与队伍连上关系。入列时,先判断自己队伍(用map得到)是否在长列中(第二队列相应数组的大小是否为0)。如果存在,将编号插入长列(第二队列相应数组的尾端)。如果不存在,将队伍插入第一数列,将编号插入长列(第二队列相应数组的尾端);出列时,输出编号,将编号从长列中删去(第二队列的相应数组),然后判断长列中是否存在该编号的队伍,如果存在,则不影响,如果不存在,则将队伍从第一队列中删去。注意要输出格式。每个样例队列要清空
ac代码:
#include <iostream>
#include <queue>
#include <map>
using namespace std;
int main()
{
map <int ,int>team;
int n, m, num, t, count=1;
char demand[105];
queue <int> q1, q2[1006];
while (scanf("%d", &n)!=EOF && n){
for (int i=0; i<n; i++){
cin >> m;
for (int j=0; j<m; j++){
scanf("%d", &num);
team[num] = i;
}
}
printf("Scenario #%d\n", count++);
while (scanf("%s", demand)!=EOF && demand[0] != 'S'){
if (demand[0] == 'E'){
scanf("%d", &num);
t = team[num];
if (q2[t].empty())
q1.push(t);
q2[t].push(num);
}
else if (demand[0] == 'D'){
t = q1.front();
printf("%d\n", q2[t].front());
q2[t].pop();
if (q2[t].empty())
q1.pop();
}
}
while (!q1.empty())
q1.pop();
for (int i=0; i<1006; i++)
while (!q2[i].empty())
q2[i].pop();
cout << endl;
}
return 0;
}