Team Queue
luogu-UVA540
poj 2259
题目大意:
有n个小组的人要排队,每个小组中有若干个人,当一个人入队时,如果队中有自己小组的人就跟在此人后面,否则站在队尾,现在给出一些操作,让你去操作,分别是:
从队尾入队:ENQUEUE
从对头出队:DEQUEUE
结束当前数据:STOP
样例输入
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
样例输出
Scenario #1
101
102
103
201
202
203Scenario #2
259001
259002
259003
259004
259005
260001
数据范围
1<=n<=10001<=n<=10001<=n<=1000
人的编号是0到999999范围内的整数
一个团队最多可包含1000个人
解题思路:
用n+1个队列,有1个是存小组,其它n个是存小组内的人,当某个人入队时,就直接进他小组的队,如果他进来之前,小组没人入队,那他所在的小组入队,取出时,也差不多,就去第一个小组里面取最前面的
代码:
#include<queue>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int n,x,y,t,a[1000500];
string str;
int main()
{scanf("%d",&n);while(n){printf("Scenario #%d\n",++t);//输出第几组数据for (int i=1;i<=n;++i){scanf("%d",&x);for (int j=1;j<=x;++j){scanf("%d",&y);a[y]=i;//第y个人在第i小组}}queue<int>d[1001];//定义队列cin>>str;while(str!="STOP"){if(str=="ENQUEUE")//入队{scanf("%d",&x);if (d[a[x]].empty())//如果小组没人,那小组进队d[0].push(a[x]);d[a[x]].push(x);//如小组的队}else if(str=="DEQUEUE")//查询{x=d[0].front();//最前面的小组y=d[x].front();//最前面的人d[x].pop();if (d[x].empty())//如果小组空了那小组出队d[0].pop();printf("%d\n",y);//输出}cin>>str;}putchar(10);scanf("%d",&n); }
}