算法之路——优先队列(STL)

文章介绍了C++STL中的优先队列(priority_queue)如何用于解决贪心算法问题,以合并果子问题为例,展示了如何定义、构建和操作优先队列,包括大根堆和小根堆的创建,以及push、pop、top等基本方法的使用。
摘要由CSDN通过智能技术生成

前言

今天刷洛谷一道贪心题的时候琢磨了很久,最后想到用小根堆来完成,自然而然的就想到了基于堆实现的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;
    
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值