优先队列
前言
优先队列是一种特殊的使用堆进行维护的队列。
简单来说,就是可以实现自排序的队列,使用方便,功能强大,时间复杂度为
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