题目连接
http://acm.hust.edu.cn/vjudge/problem/19518
Sample Input
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
2
5 259001 259002 259003 259004 259005
6 260001 260002 260003 260004 260005 260006
ENQUEUE 259001
ENQUEUE 260001
ENQUEUE 259002
ENQUEUE 259003
ENQUEUE 259004
ENQUEUE 259005
DEQUEUE
DEQUEUE
ENQUEUE 260002
ENQUEUE 260003
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
Sample Output
Scenario #1
101
102
103
201
202
203
Scenario #2
259001
259002
259003
259004
259005
260001
题意
有人进大队,如果大队里有他们小队的人,那么他就可以插到他们小队的末尾,否则就站到大队的末尾。
题解
先用map把组号和编号处理了,方便查找,queue2是每个小队,一次编号,queue1是大队,q2是按小队顺序的,直接查找q2的编号。
‘E…’,若q2为空,则q1.push新的小队,q2中也插入新的小队,不为空则q1不变,然后插入q2相对于的小队的末尾。
‘D…’,push q1对应的第一个小队的q2的第一个人,即q2不记录小队相对顺序只记录小队内部的顺序,而q1记录小队相对顺序
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int k=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
k++;
printf("Scenario #%d\n",k);
map<int,int>s;
for(int i=0;i<n;i++)
{
int t;
scanf("%d",&t);
for(int j=0;j<t;j++)
{
int z;
scanf("%d",&z);
s[z]=i+1;
}
}
string st;
queue<int>q,q2[1005]; //q是大队,q2是小队
while(cin>>st)
{ int jj;
if(st[0]=='S')break;
if(st[0]=='D')
{ jj=q.front();
cout<<q2[q.front()].front()<<endl;
q2[q.front()].pop();
if(q2[q.front()].size()==0)q.pop();
}
if(st[0]=='E')
{
int zz;
scanf("%d",&zz);
if(q2[s[zz]].size()==0){q2[s[zz]].push(zz);q.push(s[zz]);}
else{q2[s[zz]].push(zz);}
}
}
printf("\n");
}
return 0;
}