题目大意:队列操作,在同一个团队里的可以插队,求最终序列
题解:建立n个子队列,同时建立一个总队列记录团队的先后顺序,插队的直接插到子队列的队尾即可,对总队列没有任何影响。
#include <iostream>
#include <map>
#include <string>
#include <queue>
using namespace std;
const int MAX=1010;
const int INF=99999999;
map<int,int>Map;
queue<int>Q[MAX],p;
string operate;
bool mark[MAX];
int main(){
int n,m,a,num=0;
while(scanf("%d",&n),n){
Map.clear();
while(!p.empty())p.pop();
memset(mark,false,sizeof mark);
for(int i=1;i<=n;i++)while(!Q[i].empty())Q[i].pop();
for(int i=1;i<=n;i++){
scanf("%d",&m);
while(m--)scanf("%d",&a),Map[a]=i;
}
printf("Scenario #%d\n",++num);
while(cin>>operate,operate!="STOP"){
if(operate=="ENQUEUE"){
scanf("%d",&a);
int id=Map[a];
Q[id].push(a);
if(!mark[id])p.push(id);
mark[id]=true;
}else{
int k=p.front();
printf("%d\n",Q[k].front());
Q[k].pop();
if(Q[k].empty())p.pop(),mark[k]=false;
}
}
cout<<endl;
}
return 0;
}