题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8
用一个map来查询一个人的队伍id,last[i]保存队列中有没有队伍id的人,如果有则保存该队最后那个人的队列下标,队列queues保存的是每个人的id
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<vector>
#include<map>
using namespace std;
map<int,int> man_team;//一个人id对应的队伍id
vector<int> queues;
int last[1001];
int main()
{
int n,m,x;
int Scenario=1;
char cmd[10];
while(1)
{
scanf("%d",&n);
if(n==0) break;
printf("Scenario #%d\n",Scenario++);
memset(last,-1,sizeof(last));
queues.clear();
man_team.clear();
for(int i=0;i<n;i++)
{
scanf("%d",&m);
for(int j=0;j<m;j++){
scanf("%d",&x);
man_team[x]=i;
}
}
while(scanf("%s",cmd) && strcmp(cmd,"STOP")!=0)
{
if(cmd[0]=='E'){
scanf("%d",&x);
int teamid = man_team[x];//找到人x的队伍id
//判断队列中有没有id队伍的人
if(last[teamid]==-1){
queues.push_back(x);
last[teamid]=queues.size()-1;
}
else{
queues.insert(queues.begin()+last[teamid]+1,x);
for(int i=0;i<n;i++)//last[teamid]插入之后,其后的所有last都要+1
if(last[i]>last[teamid])
++last[i];
++last[teamid];
}
}
else if(cmd[0]=='D'){
printf("%d\n",queues.front());
queues.erase(queues.begin());
for(int i=0;i<n;i++)
if(last[i]!=-1)
--last[i];
}
/*for(int i=0;i<queues.size();i++)
printf("%d ",queues[i]);
printf("(%d %d)\n",last[0],last[1]);*/
}
printf("\n");
}
}