概述
题目链接
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 #%dn",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("%dn",x);
}else{
break;
}
}
printf("n");
}
return 0;
}
最后
以上就是顺利毛衣为你收集整理的POJ - 2259 团队队列的全部内容,希望文章能够帮你解决POJ - 2259 团队队列所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复