#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
vector<int> a;
int num,n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&num);
a.push_back(num);
}
make_heap(a.begin(),a.end(),cmp);
scanf("%d",&num);
a.push_back(num);
push_heap(a.begin(),a.end(),cmp);
cout<<a[]<<endl;
pop_heap(a.begin(),a.end(),cmp);
a.pop_back();
return ;
}

pop_heap(a.begin(),a.end(),cmp)  的功能只是将第一个元素放到最后,然后忽略最后一个元素的情况下再维护一遍堆

一:最小堆的初始堆有两种方式建立:

1、for(int i=1;i<=m;++i)

     heap_up(i);

让上面的路走通

2、for(int i=m/2;i>=1;--i)
    heap_down(i);

让下面的路走通

 

二、删除最小元素

将最后元素取代最小元素,然后heap_down(1)

三、插入元素

将元素放在数组最后,然后heap_up(m)

//合并果子    方式一
#include<iostream>
#include<stdio.h>
using namespace std; int n;int ans=;int m=;//堆的大小
int a[]; void heap_up(int d){
int father;
while(d>)
{
father=d/;
if(a[father]>a[d])
{
swap(a[father],a[d]);
d=father;
}
else break;
}
} void heap_down(int d){
int son;
while(d<=m)
{
son=*d;
if(son>m) break;
if(son+<=m&&a[son+]<a[son]) son++;
if(a[son]<a[d])
{
swap(a[son],a[d]);
d=son;
}
else break;
} } int heap_pop(){
int ret=a[];
a[]=a[m--];
heap_down();
return ret;
} void heap_push(int num){
m++;
a[m]=num;
heap_up(m);
} int main(){
cin>>n;
for(int i=;i<=n;++i)
{
cin>>a[i];
m++;
heap_up(i);
} for(int i=;i<n;++i)
{
int min1=heap_pop();
int min2=heap_pop();
ans+=min1+min2;
heap_push(min1+min2); }
cout<<ans<<endl; }
//合并果子  方式二
#include<iostream>
#include<stdio.h>
using namespace std; int n;int ans=;int m=;//堆的大小
int a[]; void heap_up(int d){
int father;
while(d>)
{
father=d/;
if(a[father]>a[d])
{
swap(a[father],a[d]);
d=father;
}
else break;
}
} void heap_down(int d){
int son;
while(d<=m)
{
son=*d;
if(son>m) break;
if(son+<=m&&a[son+]<a[son]) son++;
if(a[son]<a[d])
{
swap(a[son],a[d]);
d=son;
}
else break;
} } int heap_pop(){
int ret=a[];
a[]=a[m--];
heap_down();
return ret;
} void heap_push(int num){
m++;
a[m]=num;
heap_up(m);
} int main(){
cin>>n;
for(int i=;i<=n;++i)
{
cin>>a[i];
m++;
} for(int i=m/;i>=;--i)
heap_down(i); for(int i=;i<n;++i)
{
int min1=heap_pop();
int min2=heap_pop();
ans+=min1+min2;
heap_push(min1+min2); }
cout<<ans<<endl; }

 

最小堆的两种实现及其STL代码的更多相关文章

  1. Java执行shell脚本并返回结果两种方法的完整代码

    Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...

  2. 堆的 两种实现 (数组和STL)

    基本思想: 两种操作都跟树的深度成正比,所以复杂度  O(log(n)) ; push():在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提直到没有大小颠倒为止. pop(): 从堆中取出 ...

  3. 两种方法一句代码隐藏Activity的标题栏

    把Activity的标题栏隐藏有两种方法.一种是在在Activity里面设置javacode.还有一种是在项目的清单文件AndroidManifest.xml中设置模版样式. 一.在Activity中 ...

  4. 【柠檬班】史上最简单的Jmeter跨线程组取参数值的两种办法(不写代码)【原创】

    如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦,哪就是jmeter的变量值不能跨线程组传递.   看,官方就已经给出了解释.这个不是jmeter的缺陷,这是jmeter ...

  5. [DS+Algo] 006 两种简单排序及其代码实现

    目录 1. 快速排序 QuickSort 1.1 步骤 1.2 性能分析 1.3 Python 代码示例 2. 归并排序 MergeSort 2.1 步骤 2.2 性能分析 2.3 Python 代码 ...

  6. 两种方式(xml+代码)构建SqlSessionFactory+完整实现

    首先创建类.接口.数据库: entity包下Admin类: package com.wbg.springJavaConfig.entity; public class Admin { private ...

  7. 《徐徐道来话Java》:PriorityQueue和最小堆

    在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...

  8. java最大最小堆

    堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...

  9. jsp中两种include的区别【转】

    引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

随机推荐

  1. Java的安装过程

    记录一下自己在Windowns下安装java的过程 安装网址:http://www.oracle.com/index.html 打开网址后要先登录,如果没有号就先注册,然后才能下载 step1:下载J ...

  2. 洛谷P1613 跑路(最短路+倍增)

    P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...

  3. 聪明的kk --- 搜索超时

    二话没说上去搜索 , 果不其然 华丽超时 . #include<stdio.h> #include<string.h> #include<math.h> #incl ...

  4. --NSArray与NSMutableArray用copy修饰还是strong(转)

    一.NSMutableArray 被copy.strong修饰后的变化: 把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变 ...

  5. 数据清洗——python定位csv中的特定字符位置

    之前发过一篇关于定位csv中的特殊字符的,主要是用到了python的自带的函数,近期又遇到了一些新的问题,比如isdigit()的缺点在于不能判断浮点型,以及小数中有多个小数点的情况.发现还是正则表达 ...

  6. vs项目结构解析

    当我们用VS开发一个项目的时候,首先应该清楚用VS这个IDE生成的一些文件和文件夹是什么意思,起什么作用,什么场合下使用. 因为我使用的是VS2015,就以这个为例来进行一些说明: 首先要做的是更改你 ...

  7. 研磨JavaScript系列(五):奇妙的对象

    在JavaScript中,只有object和function两种东西有对象化的能力.我们先来说说函数的对象化能力. 任何一个函数都可以为其动态地添加或去除属性,这些属性可以是简单类型,可以是对象,也可 ...

  8. 给网站添加运行时间的JavaScript完整代码

    function secondToDate(second) { if (!second) { return 0; } var time = new Array(0, 0, 0, 0, 0); if ( ...

  9. Android RecyclerView notifyDataSetChanged不起作用

    一般listview设置完data后调用notifyDataSetChanged便可刷新布局界面,然而recycleview调用这个方法却没有任何反应.对于很多不熟悉recycleview的话很容易躺 ...

  10. webpack 打包后 Uncaught SyntaxError: Unexpected token <

    问题描述:npm run dev 没报错.是可以正常运行的, npm run build 过程也没报错, 但是打开dist   index.html  就报错了  错误内容:       解决方法: ...