#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. js中的slice()、substring()、substr()、split()、join()、indexof()

    在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧 ...

  2. flux,redux,vuex状态集管理工具之间的区别

    一:redux和flux的区别 1)redux是flux中的一个实现 2))在redux中我们只能定义一个store,在flux中我们可以定义多个 3)在redux中,store和dispatch都放 ...

  3. SceneView 追踪选择目标

    在编辑器的Scene视图中追踪选择目标,调试动作用 SceneView这个类没有说明文档比较蛋疼 在update中调用SceneViewCameraFace2Target函数,编辑器的OnInspec ...

  4. Elasticsearch搜索常用API(利用Kibana来操作)

    上面我们已经介绍了Elasticsearch的一些基本操作,这篇文章属于进阶篇,我们一起来学习. 前面我们创建了sdb和user文档,现在我们来看如何查询user中所有的文档呢? GET /sdb/u ...

  5. OpenResty / Nginx模块,Lua库和相关资源的列表

    OpenResty / Nginx模块,Lua库和相关资源的列表 什么是OpenResty OpenResty是一个成熟的网络平台,它集成了标准的Nginx核心,LuaJIT,许多精心编写的Lua库, ...

  6. 6月来了,Java还是第一!

    2019年6月了,话说现在很多小孩子都开始接触幼儿编程了,我也经常看到幼儿编程的广告,编程门槛真的是越来越低. 除此之外,也有大量其他行业的从业者想转软件开发的,编程那么广,语言那么多,那么在这么多编 ...

  7. jQuery里$.post请求,后台返回结果为“json”格式,前台解析错误问题记录

    在JSP页面使用$.post请求后台返回json数据时,在最后 必须加上返回数据格式为json的才行.不然JSP页面解析会出错.

  8. Android 蓝牙开发基本流程

    此例子基于 android demo 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少     Android对于蓝牙开发从2.0版本的sdk才开始支持,而 ...

  9. [转]Linux下paste命令详解

    转自:http://blog.csdn.net/andy572633/article/details/7214126 paste单词意思是粘贴.该命令主要用来将多个文件的内容合并,与cut命令完成的功 ...

  10. python--11、数据库及SQL基础

    常用命令记录 查看库中所有表的引擎 SHOW TABLE STATUS FROM `center_main_db`; 还有一个更简洁,查询cmol_system_db库所有表的存储引擎\ SELECT ...