我是靠谱客的博主 高高路灯,最近开发中收集的这篇文章主要介绍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 #%dn",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("%dn",team[t].front());
                team[t].pop();
                if(team[t].empty()) all.pop();      //如果这个团队为空,在all队列里面踢出去
            }
        }
        puts("");
    }
    return 0;
}

最后

以上就是高高路灯为你收集整理的UVA 540 Team Queue(团体队列)题目链接的全部内容,希望文章能够帮你解决UVA 540 Team Queue(团体队列)题目链接所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部