我是靠谱客的博主 顺利毛衣,最近开发中收集的这篇文章主要介绍POJ - 2259 团队队列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接

https://vjudge.net/problem/POJ-2259

题解

       在任何时刻,同一个小组的人只要来到了队伍,就会站在一起,所以我们建立一个队列q0存储队伍中所有小组的编号,再为每个小组i建立一个队列qi存储队伍中这个小组的所有成员,一共n+1个队列。

       当一个编号为X,组号为Y的人来到队伍时,我们直接把X插入到qY的队尾,。如果在插入之前qY是空的,则还要把Y插入到q0末尾,表明队伍最后出现了一个新的小组。

      当接受出队指令时,我们通过q0得知排在最前边的小组组号为Y,然后再把qY的队头出队。出队后qY为空,就从q0开头删除Y,表明这个小组目前所有人都离开。

     这道题是多组输入,如果队列定义的是全局变量,每次都要把队列清空,c++的queue没有清空队列的函数,需要自己手动清空。  或者定义成局部变量就不用清空了。

代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
int a[maxn];
char c[20];
int main(){
    int n;
    int t=1;
    while(cin>>n&&n){
        printf("Scenario #%dn",t++);
        queue<int> q[1005];
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            while(x--){
                int y;
                scanf("%d",&y);
                a[y]=i;
            }
        }
        while(true){
            scanf("%s",c);
            if(c[0]=='E'){
                int x;
                scanf("%d",&x);
                int y=a[x];
                if(q[y].empty()){
                    q[0].push(y);
                }
                q[y].push(x);
            }else if(c[0]=='D'){
                int y=q[0].front();
                int x=q[y].front();
                q[y].pop();
                if(q[y].empty()) q[0].pop();
                printf("%dn",x);
            }else{
                break;
            }
        }
        printf("n");
    }
    return 0;
}

 

最后

以上就是顺利毛衣为你收集整理的POJ - 2259 团队队列的全部内容,希望文章能够帮你解决POJ - 2259 团队队列所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部