题目
http://poj.org/problem?id=2259
https://www.luogu.org/problemnew/show/UVA540
解题思路
我们可以建立一个队列 a[0] a [ 0 ] 存储队伍中所有小组的编号,再为每个小组 i i 建立一个存储队伍中这个小组的所有成员。
当一个编号为X,组号为 Y Y 的人来队伍时,我们直接把X插入的末尾。如果在插入之前 a[y] a [ y ] 是空的,则还要把Y插入到 a[0] a [ 0 ] 的末尾,表明队伍最后出现了一个新的小组。
当接收到出队指令时,我们通过 a[0] a [ 0 ] 得知排在最前面的小组组号Y,然后再把 a[y] a [ y ] 的队头出队。出队后如果 a[y] a [ y ] 为空,就从 a[0] a [ 0 ] 开头删除 Y Y <script type="math/tex" id="MathJax-Element-496">Y</script>,表明这个小组目前所有人已经离开。
!!!注意,输出有“Scenario #%d\n”这个东西
代码
#include<cstdio>
#include<queue>
#include<string>
#include<iostream>
using namespace std;
queue<int>a[1010];
string s;
int n,g,t,len,b[1000000];
int main()
{
while (1)
{
scanf("%d",&n); if (!n) return 0;
bool h=true;
for (int i=1;i<=n;i++)
{
scanf("%d",&t);
for (int j=1;j<=t;j++)
scanf("%d",&g),b[g]=i;
}
while (1)
{
cin>>s; if (s=="STOP") break;
if (s=="ENQUEUE") {
scanf("%d",&g);
if (a[b[g]].empty()) a[0].push(b[g]);
a[b[g]].push(g);
} else {
if (h) printf("Scenario #%d\n",++len),h=false;
g=a[0].front();
printf("%d\n",a[g].front()); a[g].pop();
if (a[g].empty()) a[0].pop();
}
}
for (int i=1;i<=n;i++)
while (!a[i].empty()) a[i].pop();
while (!a[0].empty()) a[0].pop();
printf("\n");
}
}