最小堆的两种实现及其STL代码
#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代码的更多相关文章
- Java执行shell脚本并返回结果两种方法的完整代码
Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...
- 堆的 两种实现 (数组和STL)
基本思想: 两种操作都跟树的深度成正比,所以复杂度 O(log(n)) ; push():在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提直到没有大小颠倒为止. pop(): 从堆中取出 ...
- 两种方法一句代码隐藏Activity的标题栏
把Activity的标题栏隐藏有两种方法.一种是在在Activity里面设置javacode.还有一种是在项目的清单文件AndroidManifest.xml中设置模版样式. 一.在Activity中 ...
- 【柠檬班】史上最简单的Jmeter跨线程组取参数值的两种办法(不写代码)【原创】
如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦,哪就是jmeter的变量值不能跨线程组传递. 看,官方就已经给出了解释.这个不是jmeter的缺陷,这是jmeter ...
- [DS+Algo] 006 两种简单排序及其代码实现
目录 1. 快速排序 QuickSort 1.1 步骤 1.2 性能分析 1.3 Python 代码示例 2. 归并排序 MergeSort 2.1 步骤 2.2 性能分析 2.3 Python 代码 ...
- 两种方式(xml+代码)构建SqlSessionFactory+完整实现
首先创建类.接口.数据库: entity包下Admin类: package com.wbg.springJavaConfig.entity; public class Admin { private ...
- 《徐徐道来话Java》:PriorityQueue和最小堆
在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...
- java最大最小堆
堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...
- jsp中两种include的区别【转】
引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...
随机推荐
- P4166 [SCOI2007]最大土地面积
传送门 首先,四边形的四个点肯定都在凸包上(别问我为什么我也不知道,感性理解一下好了) 那么我们可以求出凸包之后\(O(n^4)\)暴力枚举,据说在随机数据下凸包上的点只有\(O(logn)\)个可过 ...
- mysql select 操作优先级
单表查询操作 select filed1,filed2... form table where ... group by ... having .... order by ... limit ... ...
- BZOJ 4828 DP+BFS
被一道简单BFS坑了这么长时间我也是hhh了 //By SiriusRen #include <bits/stdc++.h> using namespace std; ,,):d(D),x ...
- mybatis 中 foreach 的性能问题及调优
1.mybatis中最初的sql语句 SELECT 参数1, 参数2, 参数3 FROM 表 WHERE 条件参数1 in <foreach item="item" inde ...
- 学习Objective-C入门教程(分享)
原百度文库连接:http://wenku.baidu.com/view/6786064fe518964bcf847c63.html PS:需要原文档的可以留邮箱发送! (我叫雷锋,不要谢我) 学习Ob ...
- java 任意时间转换日期类型
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); try { Date dd=sdf.parse("201 ...
- iOS动画——DynamicAnimate
力学动画 以dynamicAnimate为首的力学动画是苹果在iOS7加入的API,里面包含了很多力学行为,这套API是基于Box2d实现的.其中包含了重力.碰撞.推.甩.和自定义行为. 涉及到的类如 ...
- js基础---数据类型转换
js中数据类型: 简单数据类型: number:233,-34,0x23,023 string:"hello"或者'hello' boolean:true.false undefi ...
- Oracle、Db2、SqlServer、MySQL 数据库插入当前系统时间
做易买网项目,由于对数据库插入系统时间不了解,常常遇到的问题: 1.java.sql.SQLException: ORA-01861: 文字与格式字符串不匹配.原因:由于获取系统时间类型不对,应为sy ...
- webstrom常用键
常用快捷键—Webstorm入门指南 提高代码编写效率,离不开快捷键的使用,Webstorm拥有丰富的代码快速编辑功能,你可以自由配置功能快捷键. 快捷键配置 点击“File”-> “setti ...