POJ 2259 Team Queue(队列)

传送门

题目大意

现在有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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值