堆学习笔记(未完待续)(洛谷p1090合并果子)
上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补;

——————来自百度百科
所以,堆其实就是一棵树;
大根堆:根节点比子节点权大;
小根堆:根节点比子节点权小;
了解到了这里,我觉得可以开始做题了;
题面自己去洛谷看(我懒)
就是一个小根堆,每次取最小的两堆果子合并,排序会tle,所以用堆做,每次把合并后的再加入堆中就行了;
为了练习,先来一个手写堆;
详细看代码:
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cmath>
using namespace std;
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return x*f;
}
int dui[],n,m,ans;
inline void down(int x)
{
if(x*<=n)
{
int t=x;
if(dui[x]>dui[x*])t=x*;
if(dui[x]>dui[x*+]&&x*+<=n&&dui[x*+]<dui[x*])t=x*+;
if(x==t)return;
swap(dui[x],dui[t]);
down(t);
}
}
inline void up(int x)
{
if(x>)
{
if(dui[x]<dui[x/]){
swap(dui[x],dui[x/]);
up(x/);
}
}
}
inline int top(){return dui[];}
inline void delet()
{
dui[]=dui[n];
dui[n--]=;
down();
}
inline void add(int x)
{
dui[++n]=x;
up(n);
}
int main()
{
m=read();
for(int i=;i<=m;i++)
{
int a=read();
add(a);
}
for(int i=;i<m;i++)
{
int x=top();
delet();
int y=top();
delet();
ans+=(x+y);
add(x+y);
}
cout<<ans<<endl;
return ;
}
#include<iostream>
#include<cctype>//为了用isdigit
#include<cstdio>
using namespace std;
inline int read()//快读(isdigit用来判读入的是否是数字,据说比c>'0'这样的快) ;
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return x*f;
}
int n,dui[],size;//dui用来存堆,size记录元素个数;
inline void swap(int &a,int &b){int t=a;a=b;b=t;return;}//交换值,&直接取地址交换,据说手写更快;
inline void up(int i)//把堆里元素向上移动
{
while(i>)//直到查询到堆顶
if(dui[i]<dui[i/])//如果i的元素比它父节点小,则交换两个元素;
{
swap(dui[i],dui[i/]);
i/=;//继续向上查询
}
else return;
}
inline void init(int x){dui[++size]=x;up(size);}//插入新的元素,size+1,然后看新元素是否要往上移动;
void down(int i)//向下移动大的元素
{
int s=i*;//i的左儿子
while(s<=size)
{
if(dui[i*+]<dui[i*])s++;//从i的左儿子和右儿子中选择较小的交换
if(dui[i]>dui[s])//如果i的权值比i的儿子的权值大,将i向下移动
{
swap(dui[i],dui[s]);
i=s;s=i*;//注意!!!一定要i=s,我忘了会+1卡了好久,左子树和右子树一定要分清楚!!!
}
else return;
}
}
void shanchu(){dui[]=dui[size--];down();}//合并后删除堆顶元素 ,并将元素向下传递;
int top(){return dui[];}//取出堆顶元素
int main()
{
n=read();
int a;
for(int i=;i<=n;i++)
{
a=read();init(a);
}
long long answer=;
while(size>=)
{
int a1=top();
shanchu();
int a2=top();
shanchu();//取出堆中最小的的两堆果子
answer+=(a1+a2);
init(a1+a2);//将合并后的一堆果子加入堆中
}
printf("%lld\n",answer);
return ;
}
偷懒做法,用STL
#include<iostream>
#include<set>
using namespace std;
multiset<int>dui;//multiset会自动帮你排序,从小到大,设它是一个堆
int n;
int main()
{
int a;
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a;
dui.insert(a);//把元素放进堆里
}
int ans=;
for(int i=;i<=n-;i++)
{
int a1=*dui.begin();//dui.begin()返回的是地址,*取出地址里的值;
dui.erase(dui.begin());//删除堆顶,用地址传递
int a2=*dui.begin();
dui.erase(dui.begin());
ans+=(a1+a2);
dui.insert(a1+a2);//将合并后的加入堆
}
cout<<ans<<endl;
return ;
}
未完待续,如果我忘了可以催更(虽然没人看我博客)
堆学习笔记(未完待续)(洛谷p1090合并果子)的更多相关文章
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- linux学习笔记---未完待续,缓慢更新
做为linux菜鸟,由于work的需要,慢慢的开始接触学习linux. <鸟哥的linux私房菜>学习笔记. 一.基础命令操作 1.显示日期的命令 date 执行date命令后,显示结果为 ...
- 【洛谷P1090 合并果子】
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 洛谷 P1090合并果子【贪心】【优先队列】
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- [NOIP2004] 提高组 洛谷P1090 合并果子
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 洛谷P1090 合并果子【贪心】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所 ...
- 洛谷P1090——合并果子(贪心)
https://www.luogu.org/problem/show?pid=1090 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合 ...
- jQuery 学习笔记(未完待续)
一.jQuery概述 宗旨: Write Less, Do More. 基础知识: 1.符号$代替document.getElementById()函数 2.使 ...
- oracle-绑定变量学习笔记(未完待续)
--定义变量SQL> var a number; --给绑定变量赋值SQL> exec :a :=123; PL/SQL procedure successfully completed. ...
随机推荐
- hive tez调优(3)
根据.方案最右侧一栏是一个8G VM的分配方案,方案预留1-2G的内存给操作系统,分配4G给Yarn/MapReduce,当然也包括了HIVE,剩余的2-3G是在需要使用HBase时预留给HBase的 ...
- checkbox后台传个list显示和回显的页面代码C标签
<c:forEach items="${listtest}" var="provinces"> <input type= ...
- mysql和mssql数据库快速创建表格 五
* into testAAA FROM tbl_User --sqlserver方法一复制表结构 select * into testAAA FROM tbl_User --sqlserver复制表结 ...
- git补充(命令)转自https://github.com/Wasdns/github-example-repo
在使用命令行进行提交时,通常使用git commit -m '注释信息'来填写commit注释信息,但是-m参数适合单行注释,对于多行的commit注释来说是不合适的.这里推荐使用git commit ...
- Delphi BASE64单元EncdDecd的修改
Delphi BASE64单元EncdDecd的修改 EncdDecd.pas两个函数声明: procedure EncodeStream(Input, Output: TStream);proced ...
- What are the benefits to using anonymous functions instead of named functions for callbacks and parameters in JavaScript event code?
What are the benefits to using anonymous functions instead of named functions for callbacks and par ...
- 3dmax联机分布式渲染方法技巧详解
3dmax联机分布式渲染方法技巧详解 \测试环境:win7系统 3DMAX2009 Vray2.0 .首先要保证你的两台电脑能在局域网里互相访问如图: 其他电脑上也一样都能打开对方的电脑! 步! ...
- 组合数学---P1358 扑克牌
P1358 扑克牌 题解 组合数学 Π c[剩余未选牌数][ai] ( i = 1,2,...,m ) 注意 组合数也要取模,不然数字太大会炸 组合数的具体实现就是Dp啊 代码 #include< ...
- 对请求数据的格式化 方案 Spring Cloud Gateway features:
对请求数据的格式化 例如 {body:{}}--->{data:{}} 执行阶段概念 · OpenResty最佳实践 · 看云 https://www.kancloud.cn/kancloud/ ...
- 【转载】 迁移学习简介(tranfer learning)
原文地址: https://blog.csdn.net/qq_33414271/article/details/78756366 土豆洋芋山药蛋 --------------------------- ...