我是靠谱客的博主 无心自行车,最近开发中收集的这篇文章主要介绍UVA 540团队队列(STL之队列、优先队列),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目描述

有t个团队的人正在排一个长队。每次新来一个人时,他进入队伍的顺序有两种选择:如果有队友在长队中,则他排队长队中最后一个队友的后面;如果没有队友在长队中,则他排到整个长队的最后面。
要求该程序有三种指令:

  1. ENQUEUE x:编号为x的人进入长队;
  2. DEQUEUE x:长度的队首出队
  3. STOP:停止本次case

题目分析

  1. 维护两个队列queue,第一个队列是队伍号的队列,第二个队列是所有队伍中各自队员的队列;
  2. 根据操作依次进行操作即可

AC代码

/*
Author:snnu_lgw
Date:2020/6/26
uva 540 
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t,Case=0;
	map<int,int>team;//映射关系为(每个人的编号,每个人的队伍的编号)
	while(cin>>t&&t!=0)
	{
		printf("Scenario #%dn",++Case);
		for(int i=0;i<t;i++)
		{
			int n,x;
			cin>>n;    //该队伍的人数 
			while(n--)
			{
				cin>>x;  //输入某个人的编号
				team[x] = i; //他们的队伍号都为i 
			}
		}
		
		queue<int> q,q2[1000+10];//q是队伍编号的队列,q2是每个队伍的队列 
		while(true)
		{
			string str;
			cin>>str;
			if(str[0]=='E')
				{
					int num;
					cin>>num;
					int t = team[num]; //编号为num的人的队伍号
					if(q2[t].empty())	
						q.push(t);    //团队t进入到团队队列 
					q2[t].push(num);   //num进入到队伍t的队列中 
				}
			else if(str[0]=='D')
				{
					int top = q.front(); //队伍编号 
					printf("%dn",q2[top].front());//输出该队伍中的第一个人的编号
					q2[top].pop(); //同时把这第一个人弹出队列
					if(q2[top].empty())//如果把这个人弹出队列后,队伍为空,那么需要把这个队伍从团体队列中删除
						q.pop(); 
				}
			else if(str[0]=='S')
				break;
		}
		cout<<endl;
	}
	return 0;
}

补充知识

优先队列,弹出队列时默认弹出优先级高的!

/*默认越小的整数,优先级越低,*/
priority_queue<int>pq;

/*重新定义,越大的整数优先级越低*/
priority_queue<int,vector<int>,greater<int> >pq;
/*
**  优先队列(大顶堆),加上两个参数之后变为小顶堆,注意在第三个参数后面加一个空格,否则视为输入流信号 
**  实现哈夫曼树,每次可以将队列中优先级最大(数值最小)的那个出队列。哈夫曼树的权值即为所以非叶子节点的和 
*/

最后

以上就是无心自行车为你收集整理的UVA 540团队队列(STL之队列、优先队列)的全部内容,希望文章能够帮你解决UVA 540团队队列(STL之队列、优先队列)所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部