UVA 540 Team Queue(团体队列)

题目链接

题意

t个团队的人正在排队。
每次新来一个人,如果他有队友在排队,那么这个人会插入到最后一个队友的后面;
如果没有队友在排队,那么他会插入到长队的队尾

解决

  1. 团体队列问题
  2. 用一个队列all来表示t个队伍组成的队列,元素是队伍编号
  3. 建立t个队伍内部的队列team[maxn],用来表示团队内部的队列
  4. 注意当这个人入队时如果他的队伍不在all队列中,要把这个队伍入队(all队列中)
  5. 注意当一个人离开队伍后这个队伍为空,那么要把这个队伍出队(all队列中)
#include<bits/stdc++.h>
using namespace std;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
const int maxn = 1005;

int main()
{
    int t,cases=1;
    while(scanf("%d",&t)&&t>0)
    {
        printf("Scenario #%d\n",cases++);

        map<int,int>mymap;              //用于保存每个人所属的队伍编号
        int n,x;
        rep(i,0,t){
            scanf("%d",&n);
            rep(j,0,n){
                scanf("%d",&x);
                mymap[x]=i;
            }
        }


        char str[10];
        queue<int>all,team[maxn];   //all是团队的队列,team是每个团队内部的队列
        while(1)                    //就像all是景点里面所有旅游团组成的队列,team[i]是旅游团内部的队列
        {
            //getchar();
            scanf("%s",str);
            if(str[0]=='S') break;
            if(str[0]=='E')
            {
                scanf("%d",&x);
                int t=mymap[x];     //获得所属于的团队
                if(team[t].empty()) all.push(t);    //如果刚开始这个团队是空的,这个团队需要加入all队列
                team[t].push(x);
                continue;
            }
            if(str[0]=='D')
            {
                scanf("%d",&x);
                int t=all.front();                  //获取all队列里第一个团队编号
                printf("%d\n",team[t].front());
                team[t].pop();
                if(team[t].empty()) all.pop();      //如果这个团队为空,在all队列里面踢出去
            }
        }
        puts("");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值