当前位置: 首页 > news >正文

合并果子

image

这道题是经典的哈夫曼树 / 贪心算法问题,核心思路是每次合并最小的两堆果子,以减少重复计算的总代价。下面给你完整的思路和可直接运行的代码。

一、核心思路
每次合并两堆果子,消耗的体力等于两堆重量之和。为了让总体力消耗最少,我们应该优先合并当前最小的两堆,这样较大的数值会被重复计算的次数更少。

这个过程可以用 小根堆(优先队列 来高效实现:

  1. 将所有果子的数量加入小根堆。
  2. 每次取出堆顶的两个最小值,合并它们,将和累加到总消耗中再把合并后的和放回堆里(用于后续的合并)。
  3. 重复步骤 2,直到堆中只剩一个元素(只剩一堆无需再合并)。

二、代码实现(Java)

import java.util.PriorityQueue;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();PriorityQueue<Integer> heap = new PriorityQueue<>(); // 小根堆for (int i = 0; i < n; i++) {int a = sc.nextInt();heap.add(a);}long total = 0; // 用long防止溢出while (heap.size() > 1) {int x = heap.poll();int y = heap.poll();int sum = x + y;total += sum;heap.add(sum);}System.out.println(total);sc.close();}
}

三、复杂度分析

  • 时间复杂度:O(n log n),每个元素入堆 / 出堆操作是O(log n),共n-1次合并。
  • 空间复杂度:O(n),用于存储堆中的元素。

本质:哈夫曼树的 “带权路径长度”
这个问题本质上就是求哈夫曼树的最小带权路径长度(WPL)

  • 每个果子堆的重量是 “权值”
  • 合并的次数就是 “路径长度”(权值被累加的次数)
  • 总消耗就是所有 “权值 × 路径长度” 的和

哈夫曼树的构造规则,就是让权值越小的节点,深度越大(路径长度越长)权值越大的节点,深度越小(路径长度越短),这样 权值×路径长度 的总和才会最小

哈夫曼树的最小带权路径长度WPL只算原始叶子节点,不算合并出来的新数

题目理解:先将两堆合并成一堆,再将这一堆继续合并,每次消耗的体力都计算两堆重量之和,由此可知,被合并的堆是会被重复计算的,为了使得体力消耗最小,也就是重量计算最小,每次合并的时候都取重量较小的堆。理解完题目不难联想到哈夫曼树,哈夫曼树的最小带权路径长度WPL = 权值 × 路径长度之和,权值等价于果子堆的重量路径长度等价于果子堆被使用的次数,或者说参与到重量计算中的次数。每一堆果子堆参与到合并的次数乘以它们的权值再累加正好就等于合并果子最小体力消耗

代码解释

小根堆:PriorityQueue heap = new PriorityQueue<>();

一、什么是小根堆?
小根堆是一种特殊的完全二叉树,满足两个核心性质:

  1. 结构性质:它是一棵完全二叉树(除了最后一层,其他层都填满,且最后一层的节点靠左排列)。
  2. 堆序性质:每个父节点的值,都小于或等于它所有子节点的值。
    所以,整个堆的最小值一定在根节点(堆顶)

二、小根堆的核心操作

以 Java 的PriorityQueue(默认就是小根堆)为例,关键操作有 3 个:

操作 作用 时间复杂度
add(x) / offer(x) 把元素 x 插入堆中,并自动调整堆序,保证根节点最小 O(logn)
poll() 取出并删除堆顶的最小值,然后自动调整堆序 O(logn)
peek() 查看堆顶的最小值,不删除 O(1)

为什么插入和删除是O(log n)?

image

三、小根堆在 “合并果子” 问题里的作用

回到题目,我们的核心需求是:每次快速找到当前最小的两堆果子合并。

如果不用小根堆,每次都遍历数组找最小值,时间复杂度是O(n2),当n=104时会超时。

用小根堆之后,每次取最小的两堆、合并后放回,都是O(log n)的操作,总复杂度O(nlog n),完全可以通过。

结合之前的例子 [1, 2, 9],用小根堆的过程:

  1. 建堆:堆中是 [1, 2, 9],根节点是 1。
  2. 第一次取两个最小值:poll()得到 1,再poll()得到 2。合并和为 3,总消耗 + 3,把 3 放回堆里。现在堆中是 [3, 9]。
  3. 第二次取两个最小值:poll()得到 3,再poll()得到 9。合并和为 12,总消耗 + 12,把 12 放回堆里。现在堆中只剩[12],结束。

四、补充:小根堆 vs 大根堆
很多语言的优先队列默认是大根堆(比如 C++ 的priority_queue),而 Java 的PriorityQueue默认是小根堆。两者的区别只是堆序性质相反:

  • 小根堆:父节点 ≤ 子节点,堆顶是最小值
  • 大根堆:父节点 ≥ 子节点,堆顶是最大值

五、一句话总结

小根堆就是一个 “能快速拿到最小值”的优先队列,它用完全二叉树的结构保证了插入、删除最小值的高效性,是解决这类贪心合并问题的 “神器”。

小根堆并不是内部自动做升序排序,它只是维护了「堆顶是全局最小值」这个核心性质。

1. 堆的底层结构
堆在内存里通常是用数组存储的,但这个数组不是严格升序排列的。它只保证一个局部性质
每个父节点的值 ≤ 它的两个子节点的值(小根堆)

2. 堆和排序的本质不同

  • 排序(比如升序):需要整个序列的所有元素都满足 a[0] ≤ a[1] ≤ a[2] ≤ ... ≤ a[n-1],是全局有序。
  • :只保证「局部」的父子关系有序,并不保证整个序列有序。它的核心优势,是能在 O (1) 时间拿到最小值,O (log n) 时间完成插入 / 删除。

3. 那为什么我们感觉它在 “排序”?

因为在使用小根堆时,我们通常会按这个流程操作:

  1. 把所有元素 add 进堆
  2. 循环调用 poll() 取出堆顶元素
    这个过程叫堆排序,最终得到的结果是升序的。但注意:
  • 堆本身的内部数组,自始至终都不是完全有序的。
  • 有序的结果,是你通过「不断取出堆顶」这个操作得到的,而不是堆内部自己维护的。
http://www.jsqmd.com/news/834859/

相关文章:

  • 快速记忆网络分层模型口诀
  • 在AWS云上使用EC2 嵌套虚拟化实例部署Cube Sandbox的实践和问题
  • 这届毕业论文,先得让AI满意,应届生都在悄悄用它写论文、降重... - AI论文先行者
  • 2026年杭州沙发翻新厂家精选|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌实力对比、服务内容、覆盖区域与联系方式全解析 - 卓信营销
  • 【AI工具推荐】宝藏级!国内平台19款免费AI工具,教师人工智能素养提升必备工具! - AI论文先行者
  • 北京本地正规黄金回收 全市上门高价结算 靠谱口碑不套路 北京 16 区通用 - 金掌柜黄金回收
  • KDE Linux QQ 微信不能使用中文输入法
  • DolphinDB开发者评测:用多范式编程重新定义时序数据分析
  • 罗技 G502 HERO 参数规格
  • 2026在线去除视频水印用什么工具?好用的视频去水印工具对比推荐 - 爱上科技热点
  • 绵阳卖黄金不用出门!正规同城上门回收,价格公道办事靠谱不玩套路 - 金掌柜黄金回收
  • 2026年武汉沙发翻新精选|匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大品牌全解析:服务内容、覆盖区域与联系方式 - 卓信营销
  • 成都市场日照集团热轧H型钢|2026年5月(上、中、下旬)出厂价格及政策|盛世钢联订货指导价 - 四川盛世钢联营销中心
  • 抖音图片怎么去水印?2026年去水印在线工具和方法完整对比 - 爱上科技热点
  • 2026年5月天梭官方售后网点亲测报告(含迁址/新开)——现场记录与踩坑实录 - 天梭服务中心
  • 绵阳本地老牌黄金回收|全城上门结算快捷,多年口碑靠谱值得信赖 - 金掌柜黄金回收
  • 2026年济南市驾照机构实力推荐就选择:山东东日驾驶员培训有限公司 - 品牌推广大师
  • 抖音视频怎么去水印?2026最新在线去水印网站与方法全指南 - 爱上科技热点
  • 雨和虹防水维修:杭州绿城蓝色钱江卫生间漏水维修真实案例|精装房免砸砖根治渗水发霉 - 雨和虹防水维修
  • 76.沧州报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 2026年怎么降AI率?10个好用的降AIGC工具分享,AI率一键降至20%以下 - 降AI实验室
  • 92.莆田报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心
  • 北京上门黄金回收|北京全市上门回收黄金 高价结算无套路 16 区全覆盖 - 金掌柜黄金回收
  • 上海上门黄金回收|上海全市上门回收黄金 高价无套路 16 区全覆盖 - 金掌柜黄金回收
  • 如何通过分析 /var/log/secure 日志查找 SSH 暴力破解来源 IP?
  • 2026年5月劳力士官方售后网点深度评测与亲测报告(含迁址/新开门店) - 劳力士服务中心
  • 成都市场安泰集团热轧H型钢|2026年5月(上、中、下旬)出厂价格及政策|盛世钢联订货指导价 - 四川盛世钢联营销中心
  • 抖音视频怎么去水印?2026最全去水印解析方法与工具测评 - 爱上科技热点
  • 通知:知网维普更新AI检测算法,“易笔AI”已适配升级!这里免费体验,可降重降AI! - AI论文先行者
  • 74.遵义报考CPPM与SCMP,职场进阶优选众智商学院 - 众智商学院课程中心