#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. redis-缓存穿透,缓存雪崩,缓存击穿,并发竞争

    目录 缓存穿透 定义 解决方案 利用互斥锁 采用异步更新策略 使用布隆过滤器 空置缓存 缓存雪崩 定义 解决方案 给缓存的加一个随机失效时间 使用互斥锁 双缓存策略 缓存击穿 定义 解决方案 使用互斥 ...

  2. 小HY的四元组

    4.7 比赛T1,然而这题爆零了 其实很简单的...其实哈希都不用 所以首先记录每组的差值,按其sort一下再暴力找即可 #include<cstdio> #include<iost ...

  3. Django总结三

    回顾: - 装饰器 模板 - def wrapper(func): def inner(*args, **args): 执行被执行函数之前的操作 res = func(*args, **args) 执 ...

  4. 【转】linux下vi命令大全

    转自:http://www.cnblogs.com/88999660/articles/1581524.html 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi ...

  5. D3.js 力导向图(小气泡围绕中心气泡)

    html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3 ...

  6. Java——Spring介绍

    spring 是一个开源框架,是为了解决企业应用程序开发. 功能如下:1.目的:解决企业应用开发的复杂性.2.功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能.3.范围:任何Ja ...

  7. Active Learning主动学习

    Active Learning主动学习 我们使用一些传统的监督学习方法做分类的时候,往往是训练样本规模越大,分类的效果就越好.但是在现实生活的很多场景中,标记样本的获取是比较困难的,这需要领域内的专家 ...

  8. css每次的初始化代码

    ;;} body{font-size:14px;} img{border:none;} li{list-style:none;} input,select,textarea{outline:none; ...

  9. JS——样式获取的兼容写法

    样式获取 普通获取属性方式div.style.width或者div.style["width"]无法获取内嵌和外链式,只能获取行内式 window.getComputedStyle ...

  10. JS——大小写转化

    <script> var str = 'JavaScript'; console.log(str.toUpperCase());//小写转大写 console.log(str.toLowe ...