P1090 合并果子 题解
那么,我们开始吧,
堆
堆是一个完全二叉树,而且是每层都有规律的二叉树
规律大概是:
小根堆:最上层数的大小最小,往下每层结点都比父亲结点大,比两个儿子结点小
大根堆:最上层数的大小最大,往下每层结点都比父亲结点小,比两个儿子结点大
题目思路:那么,对于这个题,我们将果子堆sort一下,然后把最小的果堆作为根节点,然后把所有果子堆摞一起,构成一个堆,每次我们只要取堆中最小的两个结点,把他们的和加到体力值消耗总值里面,把这两个结点去掉,然后把他们的和重新加入堆中再维护一下,重复这个过程直到堆中只剩下一个元素,然后输出体力值就ok了
复杂度(nlogn)
安利英语单词:insert 插入,delete 删除,layer(没用到,但是学习一下) 层数,heap 堆
AC代码上菜:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int n,i0,a[],k,top1,top2,k2,insert,layer;//layer为层数,insert为插入的节点
ll sum=;
void put(int insert)//将结点插入堆中然后维护的一个函数
{
a[++k]=insert;//k为节点个数,入堆之后当然++
int k0=k;//k0为当前此结点的下标
while(k0>)//此节点不在堆头
{
if(a[k0/]>a[k0])swap(a[k0/],a[k0]);//如果父亲结点比他大,就交换(大根堆就把大于号改成小于号)
else break;//满足小根堆条件,退出
k0/=;//把它变成父亲结点(在不满足小根堆条件下)
}
}
void delete1(int i)//删除节点+维护操作
{
swap(a[i],a[k]);
k--;//长度-1,把交换后的原结点值删除
int now=,nxt,k0=k;
while(now*<=k0)
{
nxt=now*;
if(nxt<k0&&a[nxt+]<a[nxt])nxt++;
if(a[now]<=a[nxt])break;
else swap(a[now],a[nxt]);
now=nxt;
}
}
void heap()
{
while(k>)//还剩多于两堆水果
{
//思路:取出堆中两个最小的节点,然后合并,删除,并重新插入
top1=a[];insert=a[];delete1();
top2=a[];delete1(); insert+=top2;
sum+=insert;
put(insert);
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
sort(a+,a++n);//先排序
k=n;//获取结点个数
heap();
printf("%lld",sum);//输出结果
return ;
}
对大家有帮助吗QWQ
(推荐一个呗。(小声说))
P1090 合并果子 题解的更多相关文章
- NOIP提高组2004 合并果子题解
NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...
- 堆排序 P1090 合并果子
P1090 合并果子 本题要用到堆 一个小根堆 每次取出两堆,合并成一堆,为了让多多花费体力最少,我们要尽量少的重复大堆的合并,因此每次合并完以后,要把新的一坨放到堆里排一排,维护一个堆 有必要强调一 ...
- 【洛谷P1090 合并果子】
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- (贪心 优先队列)P1090合并果子 洛谷
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 洛谷 P1090合并果子【贪心】【优先队列】
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 洛谷P1090 合并果子
合并果子 题目链接 这个只能用于结构体中 struct item { int val; friend bool operator < (item a,item b) { return a.val ...
- [NOIP2004] 提高组 洛谷P1090 合并果子
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- 洛谷P1090 合并果子【贪心】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所 ...
- 堆学习笔记(未完待续)(洛谷p1090合并果子)
上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补: ——————来自百度百科 所 ...
随机推荐
- npm 使用 taobao 的镜像后,无法 login & publish
使用 npm adduser,添加用户之后,没有异常消息,然后使用 npm publish 发布,却报错: 401 原来是 npm 使用 taobao 的镜像后,需要指定 --registry htt ...
- Netty、t-io、Voovan 框架比较
以下是对三个框架在设计或者说是编码特点中选取的几个我比较关注的点的对比图: 首先我们对几个关键的概念进行一些解析,方便大家更好的理解上面表中的概念: NIO.AIO 的区别? 在这里我们来看一下两者最 ...
- .NET Core微服务之基于Exceptionless实现分布式日志记录
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.Exceptionless极简介绍 Exceptionless 是一个开源的实时的日志收集框架,它可以应用在基于 ASP.NET,AS ...
- java~mac下的终端工具oh-my-zsh
mac操作系统类似于linux,很多命令都是兼容的,确实挺好用,对于java,docker,git等开发来说,终端命令行是非常必要的工具,这里我介绍一下item2+oh-my-zsh的安装与使用. 安 ...
- Angular开发技巧
由于之前有幸去参加了ngChina2018开发者大会,听了will保哥分享了Angular开发技巧,自己接触Angular也有差不多快一年的时间了,所以打算对Angular开发中的一些技巧做一个整理 ...
- C# net request payload形式发送post请求
因为开发微信群发电脑版需要模拟微信POST请求,微信发送消息使用request payload发送,实际发送的是json字符串.我们只需要生成的json字符串和请求的一致,header头完全模拟即可. ...
- Powershell:关于PSCustomObject你想知道的一切(译)
PSCustomObject是Powershell里非常重要的一个工具,我们先从基础开始然后再循序渐进讲到一些更高级的话题.PSCustomObject旨在于用简单的方法来创建结构化数据.下面的第一个 ...
- 文件输入输出流工具: IOUtils使用总结
序言 以前写文件的复制很麻烦,需要各种输入流,然后读取line,输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法,非常方便.下面就结合源码,看看IOUTil ...
- 部署ionic开发环境
(1)安装Node.js 首先您需要安装 Node.js,后续会使用到其中的 NPM 工具. (2)安装JDK 需要安装JDK,官网下载安装.命令窗口中输入 java -Xmx2048m -versi ...
- C# T4 模板 数据库实体类生成模板(带注释,娱乐用)
说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程 1.htt ...