STL之priority_queue的使用

11 篇文章 0 订阅

priority_queue说明:

优先队列的实现就不说了,运用的是堆的知识,前几篇博客已经有提到。现在讲讲如何在比赛的时候直接用STL里面的队列头文件中的priority_queue来帮我们解题。下文有两种使用方法,一种是运用#include<functional>中的greater<type>和less<type>来帮我们实现数据的排序。还有一种是自定义,也就是自己写排序方法让priority_queue来根据我们排序方法来排序。

代码:

#include<iostream>
#include<queue>
#include<functional>
using namespace std;

const int maxn = 1001;
priority_queue<int,vector<int>,greater<int> > q;
priority_queue<int,vector<int>,less<int> > qu;

struct cmp   //自定义优先队列的顺序,按priority的编号排列
{
	friend bool operator < (cmp n1,cmp n2)
	{
		return n1.priority < n2.priority;  //从小到大排列
	}
	int priority;
	int value;
};
struct cmp1  //自定义优先队列的顺序,按priority的编号排序
{
	friend bool operator < (cmp1 n1,cmp1 n2)
	{
		return n1.priority > n2.priority;  //从大到小排序
	}
	int priority;
	int value;
};
int main()
{
	int num,m,num1,num2;
	/*
		--functional头文件中自带的排序方式(greater<int>和less<int>)
	*/
	cout<<"请输入m个数:"<<endl;
	cin>>m;
	for(int i=0;i<m;i++)
	{
		cin>>num;
		q.push(num);
		qu.push(num);
	}
	cout<<"from small to large:"<<endl;
	while(!q.empty())
	{
		int p = q.top();
		cout<<p<<endl;
		q.pop();
	}
	cout<<"from large to small:"<<endl;
	while(!qu.empty())
	{
		int p = qu.top();
		cout<<p<<endl;
		qu.pop();
	}
	priority_queue<cmp> que;
	priority_queue<cmp1> que1;
	cmp a[maxn];
	cmp1 b[maxn];
	/*
		以下为自己编写自定义排列方式
	*/
	cout<<"请输入m个数:"<<endl;
	cin>>m;
	cout<<"请输入每个数的优先次序编号和它所对应的值:"<<endl;
	for(int i=0;i<m;i++)
	{
		cin>>num1>>num2;
		a[i].priority = num1;  //根据这个编号排列
		b[i].priority = num1;
		a[i].value = num2;   //值
		b[i].value = num2;
		que.push(a[i]);
		que1.push(b[i]);
	}
	cout<<endl;
	cout<<"from large to small:"<<endl;
	while(!que.empty())
	{
		cmp p = que.top();
		cout<<p.value<<endl;
		que.pop();
	}
	cout<<"from small to large:"<<endl;
	while(!que1.empty())
	{
		cmp1 p = que1.top();
		cout<<p.value<<endl;
		que1.pop();
	}
	return 0;
}



运行结果:

functional头文件自带的排序功能运行结果:

自定义优先队列运行结果:

 优先队列实际题目(来自UVA1203 Argus)

你的任务是编写一个称为Argus的系统,该系统支持一个Register命令

Register Q_num Period

该命令注册了一个触发器,它每Period秒钟就会产生一次编号为Q_num的事件。你的任务是模拟出前k个事件。如果多个事件同时发生,先处理Q_num小的事件。

input

       输入仅包含一组数据。前若干行是Register命令,以“#”结尾;最后一行是整数k。对于每条命令,1<=Q_num,Period<=3000。k<=10000。命令条数n不超过1000.

output

       输出k行,即前k个事件的Q_num。

UVA1203代码如下:

#include<iostream>
#include<queue>
#include<cstdio>

using namespace std;

struct Item{
	int QNum,Period,Time;
	bool operator < (const Item& a) const
	{
		return Time > a.Time || (Time == a.Time && QNum > a.QNum);
	}

};
int main()
{
	priority_queue<Item> pq;
	char s[20];

	while(cin>>s && s[0] != '#')
	{
		Item item;
		cin>>item.QNum>>item.Period;
		item.Time = item.Period;
		pq.push(item);
	}
	int K;
	cin>>K;
	while(K--)
	{
		Item r = pq.top();
		pq.pop();
		cout<<r.QNum<<endl;
		r.Time += r.Period;
		pq.push(r);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值