HDU 1387 Team Queue

本文介绍了一道经典的队列模拟题HDU 1387,通过使用队列数组和主队列来实现ENQUEUE指令的功能。详细解释了如何在遇到同属一个队列的数据时进行正确地插入操作,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值