题意:先给出T个团体,并给出每个团体有多少人,每个人的编号,然后所有团体一起排队,排成一条大队列,排队的原则是,一个成员加入,如果这个成员所在的团体已经有人在排队了,那么他就加到他所在团体的最后面,而不是整个大队列的最后。如果整个大队列中没有他的团体,也就是他是他的那个团体第一个来的人,那么他就要排在整个大队列的最后(当然,他成为了他这个团体的第一人,以后他的队友来了就可以排他后面)
出队则是按大队列的顺序,从第一名开始出队的,也就是说,按排在前面的团体的人按顺序逐一出完队后下一个团体的人才有可能出队
思路:可以采用大队列嵌套小队列的思想,将一个个小队列编号,然后压入另一个队列里,比如,现在有3个队列,分别为{1,2,3},{4,5,6},{7,8,9,10}。大队列里压入团体的编号
{1,2,3},这样的话,压入一个队员时候,可以先判断他所在的团队是否在团队队列里,,如果不在的话,就把他的团队压到团队队列中,然后再把它压入团队所在的小队列中。
输出的时候输出队列的首部,然后再判断队列首部所在的小队列是否为空,如果为空的话,把她的团队编号从团队队列中弹出。
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int main()
{
int t,n,num,x;
int cas=1;
while(cin>>t,t!=0)
{
mp.clear();
queue<int>qt,q[1100];
for(int i=1; i<=t; i++)
{
cin>>n;
while(n--)
{
cin>>num;
mp[num]=i;
}
}
string str;
printf("Scenario #%d\n",cas++);
while(cin>>str)
{
if(str[0]=='E')
{
cin>>x;
int id=mp[x];
if(q[id].empty())
qt.push(id);
q[id].push(x);
}
if(str[0]=='D')
{
int que = qt.front();
printf("%d\n",q[que].front());
q[que].pop();
if(q[que].empty())
qt.pop();
}
if(str[0]=='S')
break;
}
printf("\n");
}
return 0;
}