我是靠谱客的博主 慈祥夕阳,最近开发中收集的这篇文章主要介绍HDU 1387 Team Queue,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1387

题目意思:给出n个队列,当出现ENQUEUE指令的时候,就将ENQUEUE后面的那个数据加入队伍当中,加入队伍的规则是:如果有同属一个队列的数据已经在队伍里,那么就直接加到这个已经在队伍里的那个数据的右边,如果一个都没有,那么就将这个数据加入到队伍的末尾。

题目分析:其实这就是一道队列的模拟题,维护一个队列数组已经一个主队列即可。

每当出现ENQUEUE时,边将ENQUEUE后面的数据加入到以它对应的组号为下标的那个队列数组里去,再看看对应的组号是否在主队列里出现过,未出现,就将这个组号加入到主队列。

出队时,也要判断一下,如果对应组的所有数据都出队了,就要将主队列里对应出队。说得好混乱,具体看代码吧。

#include<iostream>
#include<queue>
#include<map>
using namespace std;
const int maxn=1005;
int vis[maxn];//标记某个组是否有数据已经进主队列了
int main()
{
    int n,Case=1,cnt=0;
    while(cin>>n,n)
    {
       //cout<<endl;
        cout<<"Scenario #"<<Case++<<endl;
        queue<int>q[maxn],mq;//分别是队列数组和主队列
        map<int,int>id;//数据比较大不能开数组映射
        fill(vis,vis+maxn,0);
        for(int i=0;i<n;i++)
        {
            int m,x;
            cin>>m;
            while(m--) cin>>x,id[x]=i;//数据x属于组别i
        }
        string s;
        while(cin>>s&&s!="STOP")
        {
            if(s=="ENQUEUE")//如果进队
            {
                int x;
                cin>>x;
                q[id[x]].push(x);//先把数据放入队列数组
                if(vis[id[x]]==0) vis[id[x]]=1,mq.push(id[x]);//如果主队列并不存在这个组的元素,则把这个组号放进主队列
            }
            else
            {
                cout<<q[mq.front()].front()<<endl;//输出主队列队首组号对应的队列数组的队首元素
                q[mq.front()].pop();//对应的那个队列数组出队
                if(q[mq.front()].size()==0) vis[mq.front()]=0,mq.pop();//如果没数据了,就把这个组号在主队列里移除
            }
        }
        cout<<endl;
    }
    return 0;
}


最后

以上就是慈祥夕阳为你收集整理的HDU 1387 Team Queue的全部内容,希望文章能够帮你解决HDU 1387 Team Queue所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部