UVa540

  1. #include<cstdio>  
  2. #include<queue>  
  3. #include<map>  
  4. using namespace std;  
  5. const int maxt = 1000 + 10;  
  6. int main()  
  7. {  
  8.     int t, kase = 0;  
  9.     while(scanf("%d", &t) == 1 && t) {  
  10.         printf("Scenario #%d\n", ++kase);  
  11.   
  12.         map<int , int> team;//映射作用是编号x对应它的队伍i  
  13.         for(int i = 0; i < t; i++) {  
  14.             int n,x;  
  15.             scanf("%d", &n);  
  16.             while(n--) { scanf("%d", &x); team[x] = i;}  
  17.         }  
  18.   
  19.         queue<int> q, q2[maxt];  
  20.         //两个队列是本题的核心  
  21.         //q存放的是队伍,q2存放的是按增序排列的所有的队伍以及队伍下的编号  
  22.         //即q存放团队整体队列,例{3,1,2}  
  23.         //q2存放团队队列,例{103,101,102},{201},{301,303}  
  24.         for(;;) {  
  25.         int x;  
  26.         char cmd[10];  
  27.         scanf("%s", cmd);  
  28.         if(cmd[0] == 'S'break;//遇到STOP停止  
  29.         else if(cmd[0] == 'D'){  
  30.             int t = q.front();//用变量t表示团队整体队列的队首  
  31.             printf("%d\n",q2[t].front()); q2[t].pop();//输出这个队首队伍的第一个人,然后把该人出队  
  32.             if(q2[t].empty()) q.pop();//如果该队伍在整个队列中只有一个人,则q的队首出队,即该队伍出队  
  33.         }else if(cmd[0] == 'E'){  
  34.             scanf("%d", &x);  
  35.             int t = team[x];//通过map找出x的队列序号  
  36.             if(q2[t].empty()) q.push(t);//如果该队还没有人排在队中,则该队列插入队尾  
  37.             q2[t].push(x);//把该队伍的人插入到q2的该队中  
  38.             }  
  39.         }  
  40.         printf("\n");  
  41.     }  
  42.     return 0;  
  43. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值