堆
来源:互联网 发布:狼牙军品专卖店一淘宝 编辑:程序博客网 时间:2024/05/16 04:45
c++真的好方便啊~
洛谷p1090合并果子
这题是不断合并当前最小的两堆果子,在把合并后的果子堆插入,不断反复直至合成一堆。
这需要在线查询,于是stl库里的堆就很有用了。
不过stl库中priority_queue<int> p;定义的是大根堆,那么就要定义一个小根堆:
#include<bits/stdc++.h>#include<queue> using namespace std;int n,a[10010]={0},sum=0;priority_queue<int,vector<int>,greater<int> > q;//定义了一个小根堆q,即根节点为堆内最小值的堆。inline int read(int &num){ num=0; char c=getchar(); for(;isdigit(c)==0;c=getchar()); for(;isdigit(c)!=0;c=getchar())num=num*10+c-'0'; } inline void init() { read(n); for(int i=1;i<=n;i++){ read(a[i]); q.push(a[i]);//插入一个值为a[i]的节点。} return; } inline void que(){ int x,y; for(int i=1;i<n;i++) { x=q.top();//将x赋值为根节点的值,在小根堆中即为最小值。 q.pop();//删除根节点。 y=q.top(); q.pop(); sum+=x+y; q.push(x+y); } return; } int main() { init(); que(); printf("%d",sum); return 0; }
洛谷p3378模板题堆
没有区别......