前言
今天刷洛谷一道贪心题的时候琢磨了很久,最后想到用小根堆来完成,自然而然的就想到了基于堆实现的STL---优先队列。
先入题目:P1090 [NOIP2004 提高组] 合并果子
思路很明确,就是每次选择最小的两堆进行合并,和哈夫曼树好像。不过今天的重点不再哈夫曼树的实现,而是介绍c++的强大利器STL中的优先队列——priority_queue;
学习优先队列
基本使用方式:
头文件:#include<queue> 当然用万能头更加方便 #include<bits/stdc++.h>
定义方式: priority_queue<存储类型>容器名字
priority_queue<int>q //定义一个int类型容器
priority_queue<double>q //double
priority_queue<结构体对应名字>q //结构体
堆的构建方式:
priority_queue<存储类型,vector<储存类型>,堆(大小堆)类型> 容器名
注意两个技巧:
less<存储类型> 大根堆
greater<存储类型> 小根堆
例子:
priority_queue<int,vector<int>,less<int>> q;//大根堆储存int型数据
priority_queue<int,vector<int>,greater<int>> q;//小根堆储存int型数据
优先队列的其他基本操作
q.empty() 如果优先队列为空,则返回真
q.pop() 删除第一个元素
q.push() 加入一个元素
q.size() 返回优先队列中拥有的元素的个数
q.top() 返回优先队列中有最高优先级的元素
检验成果,完成代码
#include<bits/stdc++.h>
using namespace std;
int n,x,ans;
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
cin>>n;
for(int i=0;i<n;i++)cin>>x,q.push(x);
while(q.size()>=2){
int a = q.top();q.pop();
int b = q.top();q.pop();
ans+=a+b;
q.push(a+b);
}
cout<<ans<<endl;
}