题目链接
https://vjudge.net/problem/POJ-2259
题解
在任何时刻,同一个小组的人只要来到了队伍,就会站在一起,所以我们建立一个队列q0存储队伍中所有小组的编号,再为每个小组i建立一个队列qi存储队伍中这个小组的所有成员,一共n+1个队列。
当一个编号为X,组号为Y的人来到队伍时,我们直接把X插入到qY的队尾,。如果在插入之前qY是空的,则还要把Y插入到q0末尾,表明队伍最后出现了一个新的小组。
当接受出队指令时,我们通过q0得知排在最前边的小组组号为Y,然后再把qY的队头出队。出队后qY为空,就从q0开头删除Y,表明这个小组目前所有人都离开。
这道题是多组输入,如果队列定义的是全局变量,每次都要把队列清空,c++的queue没有清空队列的函数,需要自己手动清空。 或者定义成局部变量就不用清空了。
代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
int a[maxn];
char c[20];
int main(){int n;int t=1;while(cin>>n&&n){printf("Scenario #%d\n",t++);queue<int> q[1005];for(int i=1;i<=n;i++){int x;scanf("%d",&x);while(x--){int y;scanf("%d",&y);a[y]=i;}}while(true){scanf("%s",c);if(c[0]=='E'){int x;scanf("%d",&x);int y=a[x];if(q[y].empty()){q[0].push(y);}q[y].push(x);}else if(c[0]=='D'){int y=q[0].front();int x=q[y].front();q[y].pop();if(q[y].empty()) q[0].pop();printf("%d\n",x);}else{break;}}printf("\n");}return 0;
}