概述
题目链接: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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复