优先队列 (priority_queue)

优先队列

前言

优先队列是一种特殊的使用进行维护的队列。
简单来说,就是可以实现自排序的队列,使用方便,功能强大,时间复杂度为 O ( l o g n ) O(logn) O(logn)

创建和功能函数

优先队列的创建

优先队列存储在queue头文件中,优先队列的创建模板为:priority_queue<Type,Container,Functional>
其中type为数据类型,container为容器,functional为排序规则;

priority_queue<int,vector<int>,greater<int> >pq;

第三个参数可以省略,默认队头返回最大值;使用greater<>排序规则后,队头返回最小值,less<>和默认排序规则相同。

功能函数

其功能函数包括:
empty( ) //判断一个队列是否为空

pop( ) //删除队顶元素

push( ) //加入一个元素

size( ) //返回优先队列中拥有的元素个数

top( ) //返回优先队列的队顶元素

重载排序规则

常用的需要重载排序规则的情况一般出现于结构体类型的数据,以下给予两种重载排序规则的方法:

结构体中重载

struct node{
	int a,b;
	bool operator < (const node& x)const{
		return x < x.a;
	}
};

自己写一个排序规则

struct node
{
	int a,b;
};

struct cmp
{
	bool operator () (const node &x,const node &y) const
	{
		return x.a < y.b;
	}
};//当x的a小于y的a时,认为x<y、

例题

接下来,通过洛谷的题目P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G来巩固对优先队列的使用。以下给出我的AC代码:

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

int n, number;
priority_queue<int, vector<int>, greater<int> >q;
int main(void) {
	cin >> n;
	while (n--) {
		cin >> number;
		q.push(number);
	}
	int total = 0;
	int n1, n2;
	while (q.size()!=1) {
		n1 = q.top(), q.pop();
		n2 = q.top(), q.pop();
		total += n1 + n2;
		q.push(n1 + n2);
	}
	cout << total;
	return 0;
}

我记得第十五届蓝桥杯C/C++ B组的G题爬山,我就是使用优先队列+贪心解决的,若有兴趣可自行搜索,哈哈。

E n d End End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值