来源:互联网 发布:狼牙军品专卖店一淘宝 编辑:程序博客网 时间: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模板题堆

没有区别......


原创粉丝点击