最小堆的两种实现及其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 ...
随机推荐
- 软RAID管理
软RAID管理 软RAID 软RAID 提供管理界面:mdadm 软RAID为空余磁盘添加冗余,结合了内核中的md(multi devices). RAID 设备可命名为/dev/md0./dev/m ...
- String Successor(模拟)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3490 题意:给出一个字符串,一个操作次数,每次操作从当前字符串最右边的字符 ...
- RHEL6.5设置行号,安装GCC
vim ~/.vimrc set nu set cindent set tabstop=4 set shiftwidth=4 syntax on 安装gcc,g++编译器 ...
- $P1596 [USACO10OCT]湖计数Lake Counting$
\(problem\) 其实这题吧\(DFS\)好写一点(大雾 所以就不讲\(DFS\)了 em \(BFS\)的话 主要是 判重. 方向. 队列.(没了吧 至于位置 用两个队列?还是\(pair\) ...
- Elasticsearch集群状态健康值处于red状态问题分析与解决(图文详解)
问题详情 我的es集群,开启后,都好久了,一直报red状态??? 问题分析 有两个分片数据好像丢了. 不知道你这数据怎么丢的. 确认下本地到底还有没有,本地要是确认没了,那数据就丢了,删除索引 ...
- Node.js的运行
nodejs的运行 首先要在你的电脑上下载node.js并安装,大家可以去官网下载 1.第一种方法:去官网下载git,安装好后,在桌面上单击鼠标右键,会有一个Git Bash Here,然后在新建一个 ...
- Glide4.0 centerCrop属性和圆角 冲突
首先致谢:https://blog.csdn.net/flyinbed_/article/details/75506062 咱们不是代码的生产者,只是代码的搬运工. 最近有个工作中有个需求就是展示的图 ...
- web流行工具
中小型公司: Node.js:现代工业化前端的基础: RequireJS:AMD规范, 即将过时的 JavaScript 模块化方案: Bower:前端模块源: npm:前端工具源,另一个潜在的前端模 ...
- SQL基本操作——通配符
SQL 通配符:在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符.SQL 通配符必须与 LIKE 运算符一起使用.在 SQL 中,可使用以下通配符: 通配符 描述 % 替代一个或多个字符 ...
- Quartz实战
https://my.oschina.net/yinxiaoling/blog/542336?fromerr=s3ko7u33 Quartz实战 > 一.内存型(1) <bean name ...