UVA540 Team Queue{队列}

题目

http://poj.org/problem?id=2259
https://www.luogu.org/problemnew/show/UVA540


解题思路

我们可以建立一个队列 a[0] a [ 0 ] 存储队伍中所有小组的编号,再为每个小组 i i 建立一个a[i]存储队伍中这个小组的所有成员。
当一个编号为X,组号为 Y Y 的人来队伍时,我们直接把X插入a[y]的末尾。如果在插入之前 a[y] a [ y ] 是空的,则还要把Y插入到 a[0] a [ 0 ] 的末尾,表明队伍最后出现了一个新的小组。
当接收到出队指令时,我们通过 a[0] a [ 0 ] 得知排在最前面的小组组号Y,然后再把 a[y] a [ y ] 的队头出队。出队后如果 a[y] a [ y ] 为空,就从 a[0] a [ 0 ] 开头删除 Y Y <script type="math/tex" id="MathJax-Element-496">Y</script>,表明这个小组目前所有人已经离开。

!!!注意,输出有“Scenario #%d\n”这个东西


代码

#include<cstdio>
#include<queue>
#include<string>
#include<iostream>
using namespace std; 
queue<int>a[1010]; 
string s; 
int n,g,t,len,b[1000000]; 
int main()
{
    while (1)
    {
        scanf("%d",&n); if (!n) return 0; 
        bool h=true;
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&t);
            for (int j=1;j<=t;j++)
             scanf("%d",&g),b[g]=i;
        }
         while (1)
         {
            cin>>s; if (s=="STOP") break; 
            if (s=="ENQUEUE") {
                scanf("%d",&g); 
                if (a[b[g]].empty()) a[0].push(b[g]); 
                a[b[g]].push(g);
             } else {
                if (h) printf("Scenario #%d\n",++len),h=false;
                g=a[0].front();
                printf("%d\n",a[g].front()); a[g].pop();
                if (a[g].empty()) a[0].pop(); 
             }
         }
         for (int i=1;i<=n;i++)
          while (!a[i].empty()) a[i].pop(); 
         while (!a[0].empty()) a[0].pop(); 
         printf("\n"); 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值