上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补;

——————来自百度百科

所以,堆其实就是一棵树;

大根堆:根节点比子节点权大;

小根堆:根节点比子节点权小;

了解到了这里,我觉得可以开始做题了;

T1合并果子

题面自己去洛谷看(我懒)

就是一个小根堆,每次取最小的两堆果子合并,排序会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合并果子)的更多相关文章

  1. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  2. linux学习笔记---未完待续,缓慢更新

    做为linux菜鸟,由于work的需要,慢慢的开始接触学习linux. <鸟哥的linux私房菜>学习笔记. 一.基础命令操作 1.显示日期的命令 date 执行date命令后,显示结果为 ...

  3. 【洛谷P1090 合并果子】

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  4. 洛谷 P1090合并果子【贪心】【优先队列】

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  5. [NOIP2004] 提高组 洛谷P1090 合并果子

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  6. 洛谷P1090 合并果子【贪心】

    在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所 ...

  7. 洛谷P1090——合并果子(贪心)

    https://www.luogu.org/problem/show?pid=1090 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合 ...

  8. jQuery 学习笔记(未完待续)

    一.jQuery概述    宗旨: Write Less, Do More.    基础知识:        1.符号$代替document.getElementById()函数        2.使 ...

  9. oracle-绑定变量学习笔记(未完待续)

    --定义变量SQL> var a number; --给绑定变量赋值SQL> exec :a :=123; PL/SQL procedure successfully completed. ...

随机推荐

  1. 激活 phpstorm2019.1 win10

    首先添加以下内容到c:\windows\system32\drivers\etc\hosts 文件 0.0.0.0 account.jetbrains.com 0.0.0.0 www.jetbrain ...

  2. [线性代数] 线性子空间入門 Basic Vector Subspaces

    导语:其他集数可在[线性代数]标籤文章找到.线性子空间是一个大课题,这里先提供一个简单的入门,承接先前关于矩阵代数的讨论,期待与你的交流. Overview: Subspace definition ...

  3. 小程序 之嵌套循环修改index与item

    <block wx:for="{{menu}}" wx:key="index"> <view class="cate-item {{ ...

  4. ICEM棱柱网格生成方向【转载】

    转载自:http://blog.sina.com.cn/s/blog_8add9da60102v2hv.html 利用ICEM生成边界层网格(棱柱网格)时,发现生成的棱柱网格的方向不在流体域一侧,跑到 ...

  5. 【Linux性能调优一】观大局:系统平均负载load average

    要测试linux系统性能及调优,首先要从全局检查linux的平均负载 1.什么是平均负载 load average 系统平均负载,平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数, ...

  6. linux日常---3、linux常用操作

    linux日常---3.linux常用操作 一.总结 一句话总结: 状态的确是非常之好,享受这种状态. 1.linux删除文件夹和文件? rm -rf *:删文件和文件夹 rm -rf *.*:只能删 ...

  7. Flutter移动电商实战 --(49)详细页_Stack制作底部工具栏

    一直悬浮在最下面的 Stack层叠组件.里面用Row 可以横向布局 开始 stack如果想定位就要用position去定位. 修改return返回值的这个地方 大R刷新查看效果,可以看到固定的在左下角 ...

  8. telnet nmap netstap

    yum install nmap [root@10-13-109-236 ~]# nmap localhost Starting Nmap 6.40 ( http://nmap.org ) at 20 ...

  9. android studio: 9:57 Unsupported Modules Detected: Compilation is not supported for following modules: map, app, ota, MediaEditor, rcLcmSercive, DroneSDK, qrcodelibrary, rcService, speechService. Unfo

    Android studio Error “Unsupported Modules Detected: Compilation is not supported for following modul ...

  10. excel_vlookup函数_python代码实现

    python入门经典视频系列教程(免费,2K超清,送书) https://study.163.com/course/courseMain.htm?courseId=1006183019&sha ...