有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么这个 新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会排到长队的队尾。 输入每个团队中所有队员的编号,要求支持如下3种指令(前两种指令可以穿插进行)。
ENQUEUE x:编号为x的人进入长队。
DEQUEUE:长队的队首出队。
STOP:停止模拟。
对于每个DEQUEUE指令,输出出队的人的编号。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41#include<bits/stdc++.h> using namespace std; int main(){ int t,kase=0; while(scanf("%d",&t)&&t){ printf("Scenario #%dn",++kase); map<int,int> team; //该map存储了每个成员编号与队伍编号的对应关系,team[x]表示成员x的队伍id queue<int> q,q2[1005]; //q表示总队列,其元素为队伍编号;q2[i]表示小队i内部的队列,其元素为成员编号 for(int i=1;i<=t;++i){ //映射成员编号与队伍编号 int n,x; scanf("%d",&n); while(n--) { scanf("%d",&x); team[x]=i; } } while(1){ string cmd; cin>>cmd; if(cmd[0]=='S') break; //STOP else if(cmd[0]=='E'){ //ENQUEUE x,成员入队 int x; scanf("%d",&x); int t=team[x]; if(q2[t].empty()) q.push(t);//若小队内部没有成员, 则表明小队并不在大队列中 q2[t].push(x);//成员进入小队 }else if(cmd[0]=='D'){ //DEQUEUE,队首出队 int f=q.front(); //获取哪个小队在队首 printf("%dn",q2[f].front());//队首出队,等于大队最前面的小队的队首出队 q2[f].pop(); if(q2[f].empty()) q.pop();//若小队为空,小队整体退出大队 } } printf("n"); } return 0; }
最后
以上就是贪玩月光最近收集整理的关于例题5-6 团体队列 Uva540的全部内容,更多相关例题5-6内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复