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 #%d\n",++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("%d\n",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;
/*
**  优先队列(大顶堆),加上两个参数之后变为小顶堆,注意在第三个参数后面加一个空格,否则视为输入流信号 
**  实现哈夫曼树,每次可以将队列中优先级最大(数值最小)的那个出队列。哈夫曼树的权值即为所以非叶子节点的和 
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值