码迷,mamicode.com
首页 > 其他好文 > 详细

堆——练习题

时间:2017-09-09 20:21:37      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:lin   查询   ring   思路   open   个数   out   数组   cstring   

……堆是一个很好用的东西,但遗憾的是,在oi混了三年多的我居然到现在才会……惭愧惭愧……

堆可以在O(log n) 的时间内查询最大值和最小值,非常好用的一个数据结构,本人认为比优先队列快得多……只是本人观点……

手写堆:不好写……没写过……反正c++有stl库(等到了左偏树再学……)

stl堆:感谢c++有stl这种省时省力的好东西,要是noip开放所有库并允许o2 o3优化就更好了(退役之前不用想了)

stl堆函数:

make_heap:将一个数组建堆,例:对a[1]到a[100]建堆:make_heap(a+1,a+1+100)(可添加comp)

pop_heap:将堆顶元素弹出,弹到……一般是堆底,例:将上边的堆堆顶弹到堆底:pop_heap(a+1,a+1+n)(可添加comp)

push_heap:将堆底(一般是)元素弹到堆顶,例:把上面的再弹回来:push_heap(a+1,a+1+n)(可添加comp)

sort_heap:堆排序,其实很少用,我没用过……好像用一下就不是一个正常的堆了……,例:sort_heap(a+1,a+1+n)(可添加comp)

comp函数的注意事项:

……就一个:如果是要建大根堆,就return a<b;建小根堆return a>b;其实默认是大根堆……

例题1:

合并果子:

题意:百度上有…………………………………………………………………………我好不负责任……

思路:看完题意就会了……………………………………………………………………

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<vector>
 9 #include<map>
10 #include<set>
11 using namespace std;
12 int n,ans=0,a[10024]={0};
13 bool cmp(int e,int t){
14     if(e<t) return false;
15     return true;
16 }
17 int main(){
18 //    freopen("goods.in","r",stdin);
19 //    freopen("goods.out","w",stdout);
20     scanf("%d",&n);
21     for(int i=0;i<n;i++) scanf("%d",&a[i]);
22     make_heap(a,a+n,cmp);
23     for(int i=n;i>1;i--){
24          pop_heap(a,a+i,cmp);
25          pop_heap(a,a+i-1,cmp);
26          a[i-2]=a[i-2]+a[i-1];
27          ans=ans+a[i-2];
28          push_heap(a,a+i-1,cmp);
29     }
30     cout<<ans<<endl;
31 //    fclose(stdin);
32 //    fclose(stdout);
33     return 0;
34 }

 

堆——练习题

标签:lin   查询   ring   思路   open   个数   out   数组   cstring   

原文地址:http://www.cnblogs.com/Misaki-Mei/p/7499127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!