POJ 2259 Team Queue(队列)
程序员文章站
2022-07-14 12:17:22
...
传送门
题目大意
现在有t组队伍,每个队伍有一些人,每当有人来的时候,只要前面有他认识的(即在一个队的),他就可以插进去,否则就要从后面排队,问每次输出是谁
思路
维护两个队列
一个qt用来存当前已经有人的队伍的标号,即只要这个队伍里其他人来了,就可以插进来
一个qd用来存队伍内部的先来后到
代码
queue<int> qd[maxn];//各个team内部排序
queue<int> qt;//team排序
int vist[maxn];
int main(){
int t;
int cnt=0;
map<int,int> vis;
while(~scanf("%d",&t)){
if(t==0) break;
memset(vist,0,sizeof vist);
while(!qt.empty()) qt.pop();//队伍
for(int i=0;i<maxn;i++){//队伍内部清空
if(!qd[i].empty()){
while(!qd[i].empty()) qd[i].pop();
}
}
printf("Scenario #%d\n",++cnt);
int n;
for(int i=0;i<t;i++){
cin>>n;
for(int j=0;j<n;j++){
int xx;
cin>>xx;
vis[xx]=i;//在i队
}
}
string op;
while(1){
cin>>op;
if(op[0]=='S'){
break;
}
else if(op[0]=='E'){//进入
int xx;
cin>>xx;
int team=vis[xx];
qd[team].push(xx);
if(!vist[team]){
qt.push(team);
vist[team]=1;
}
}
else if(op[0]=='D'){
int team=qt.front();
int shuchu=qd[team].front();
qd[team].pop();
printf("%d\n",shuchu);
if(qd[team].empty()){
qt.pop();
vist[team]=0;
}
}
}
puts("");
}
return 0;
}
下一篇: 无边框窗体的移动以及全屏代码