Team Queue UVA - 540

 

 

 题意:有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在队伍里,那么这个新人会插队到最后一个队友的身后;否则他就排到长队的末尾。

    ENQUEUX x: 编号为x人进入长队。

    DEQUEUX: 长队的队首出队。

    STOP: 停止模拟。

用两个队列,一个是长队,一个是各个团队的队列。

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<string>
 5 #include<cstdio>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 
10 const int maxn=1005;
11 
12 int main()
13 {   int t,T=0;
14     while(scanf("%d",&t)&&t){
15         map<int,int> text;
16         for(int i=0;i<t;i++){
17             int n,m;
18             cin>>n;
19             while(n--){
20                 cin>>m;
21                 text[m]=i;
22             }
23         }
24         printf("Scenario #%d\n",++T);
25         queue<int> Q;
26         queue<int> q[maxn];
27         
28         while(true){
29             char a[10];
30             scanf("%s",a);
31             if(a[0]=='S') break;
32             else{
33                 int n;
34                 if(a[0]=='E'){
35                     cin>>n;
36                     if(q[text[n]].size()==0) Q.push(n); 
37                     q[text[n]].push(n);
38                     
39                 }
40                 else{
41                     n=Q.front();
42                     cout<<q[text[n]].front()<<endl;
43                     q[text[n]].pop(); 
44                     if(q[text[n]].empty()) Q.pop();       //The key point!
45                 }
46             }
47         }
48         cout<<endl;
49     }
50     return 0;
51 }

 

posted @ 2017-07-25 23:19  天之道,利而不害  阅读(316)  评论(0编辑  收藏  举报