洛谷P1090 [NOIP 2004 提高组] 合并果子 题解

news/2026/1/21 20:03:32/文章来源:https://www.cnblogs.com/aaalys/p/19513915

P1090 NOIP 2004 提高组 合并果子 题解

此文章在洛谷上同步发表

题目大意

题目传送门
现在有 \(n\) 堆果子,每堆果子的重量为 \(a_i\),你要进行 \(n - 1\) 次合并。每次合并会把两堆果子合并成一堆果子,合并需要花费的体力为这两堆果子的重量之和,合并后果子的重量也为这两堆果子的重量之和。现在让你求出 \(n - 1\) 次合并花费的最小总体力。

思路

贪心思路

首先,很容易想到一个贪心:每次取重量最小的两堆果子,再取合并后重量最小的两堆果子,直到只有一堆果子为止。

证明过程

现在就要证明这个贪心,这里不妨先证明小范围贪心正确,再证明推导到大范围正确,就可以证明这个贪心正确。

step 1: 证明小范围贪心正确

假设现在只有 3 堆果子,果子的数量分别为 \(a,b,c\),假设 \(a \le b \le c\)\(a,b,c\) 的顺序与答案无关),现在开始需要先取 \(a, b\) 一定是最优的。

第一种情况:先取 \(a, b\),最终答案为 \((a + b) + (a + b + c) = 2a + 2b + c\)

第二种情况:先取 \(a, c\),最终答案为 \((a + c) + (a + b + c) = 2a + b + 2c\)

第二种情况:先取 \(b, c\),最终答案为 \((b + c) + (a + b + c) = a + 2b + 2c\)

现在需要比较 \(2a + 2b + c,2a+b + 2c,a+2b+2c\) 的大小关系。

因为三个式子都含有 \(a + b + c\),所以可以消掉 把三个式子同时减去 \(a + b + c\)

现在问题就变成了比较 \(a + b,a + c,b+c\) 的大小关系。

因为 \(a\le b \le c\),所以 \(a + b \le a + c \le b + c\)

所以第一种情况(先取 \(a, b\))一定是最优的。

再举个例子说明,比如 \(a = 3, b = 5, c = 9\)

第一种情况(先取 \(a,b\))的答案是 \(2a + 2b + c = 25\)

第二种情况(先取 \(a,c\))的答案是 \(2a + b + 2c = 29\)

第三种情况(先取 \(b,c\))的答案是 \(a + 2b + 2c = 31\)

通过比较也可以发现第一种情况(先取 \(a, b\))是最优的。

step 2: 证明推导到大范围也正确

假设有 \(n(n > 3)\) 堆果子,合并完 \(n - 3\) 次之后,还剩 3 堆果子,可以用类似的方法证明取重量最小的两堆果子是最优的。

因此,取重量最小的两堆果子一定是最优的。

代码实现

选择 priority_queue 及使用方法

现在需要一种数据结构,能动态找到数据结构中最小值和次小值,并删除他们,再插入他们的和。

我这里采用的是 stl 库中的 priority_queue(优先队列,也被称为堆),可以在 \(O( \log n)\) 的时间复杂度内插入、查询优先队列中最大 / 最小值、删除优先队列中最大 / 最小值。

priority_queue 的使用方法如下。

//定义方法
#include <queue>//需要的头文件
priority_queue<int>q1;//定义一个大根堆,查询和插入的是最大值
priority_queue<int, vector<int>, greater<int>>q1;//定义一个小根堆,查询和插入的是最小值//使用方法
q1.push(7);//往大根堆内插入一个值7
q1.push(4);//插入4
q1.push(12);//插入12
q1.top();//查询大根堆内的最大值,此时返回值为12
q1.pop();//删除大根堆内的最大值(删除12),没有返回值
q1.size();//查询优先队列数的个数,此时返回值为2
q1.top();//此时的最大值变成了7,所以返回7//小根堆的使用方法与大根堆的使用方法一样
q2.push(9);//插入一个数9
q2.top();//查询小根堆内最小值,返回9
q2.push(1);//插入1
q2.pop();//删除小根堆内最小值(删除1),同样没有返回值
q2.push(3);//插入3
q1.size();//查询优先队列数的个数,此时返回值为2
q2.top();//此时小根堆内的值为3和9,返回3

算法流程

输入输出我就不在这里说了,请读者自行思考。
1. 定义优先队列(小根堆)。
2. 将每堆果子的重量放进优先队列。
3. 取出小根堆中最小值和次小值,统计答案,放入他们的和。
4. 重复步骤三,直到只有一堆果子。

Code(只展示关键代码)

priority_queue<int, vector<int>, greater<int>>q;//1.定义小根堆
//2.将每堆果子的重量放进优先队列
//我在这里不放了,请读者自行思考
long long sum = 0;
while (q.size() > 1){//4.重复步骤三,直到只有一堆果子。int a1 = q.top();q.pop();int a2 = q.top();q.pop();//取出a1和a2,即最小值和次小值sum += a1 + a2;//统计答案q.push(a1 + a2);//放入他们的和
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1196119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POS机的机制,以及流量是怎么传送的

从POS机的硬件/软件机制和交易数据的网络传输&#xff08;流量传送&#xff09; 两个核心部分&#xff0c;清晰地解析。第一部分&#xff1a;POS机的核心机制POS机&#xff08;销售终端机&#xff09;本质上是一台安全的、专用的金融交易计算机。它的机制可以分解为以下几个关键…

构建优雅的 Vue.js 表情包选择器:一个功能丰富且可定制的 Emoji Picker 组件

在当今的社交应用、聊天工具或评论系统中&#xff0c;表情符号&#xff08;Emoji&#xff09;已成为不可或缺的表达元素。一个好的表情选择器不仅能提升用户体验&#xff0c;还能让交互变得更加生动有趣。今天&#xff0c;我将分享一个我开发的 Vue.js Emoji Picker 组件&#…

扩充练习—有理函数

练习2.92 通过加入强制性的变量序扩充多项式程序包,使多项式的加法和乘法能对其有不同变量的多项式进行。 ;;其实就是实现多项式变量的转换 ;;比如多项式(y+1)x2也可以看作(x2)y+x^2 ;;两者是相同的,主要是看变量的不…

AI时代下的DBA、写作、学习和未来.md

AI率&#xff1a;本篇文章AI率约50%&#xff0c;与AI battle回合约30次 推荐理由&#xff1a;有一些对AI ops的思考和洞察&#xff0c;所以推荐 AI时代的写作 AI对写博客、写公众号的作者来说&#xff0c;可能是一个致命的打击&#xff0c;因为AI写作实在是太简单。因为我自己…

day7 454

day7 454Leetcode 454 四数相加Ⅱ unordered_map使用的练习,一次通过,但是定义了两个unordered_map,并且需要经过两次遍历,空间和时间消耗都增加了 int fourSumCount(vector<int>& nums1, vector<int…

CF1716D 题解

Codeforces 1716D Chip Move 题解 此文章已同步在洛谷上更新 题目大意 洛谷题面 如果想看英文题面请去 CF 给定两个数 \(n,k\),问从 \(0\) 开始,第 \(i\) 步只能走 \((k+i-1)\) 的正倍数(即不能走 \(0\)),问分别走…

[Windows] 文件名精灵2025 批量修改文件名工具

[Windows] 文件名精灵2025 批量修改文件名工具 链接&#xff1a;https://pan.xunlei.com/s/VOjVKTcShvWTz972rnxzJB_RA1?pwdvywy# 在日常办公和文件管理中&#xff0c;批量修改文件名是高频需求&#xff0c;而一款高效、功能全面的工具能大幅提升效率。文件名精灵 2025 作为…

2025秋 别样的挂分大战

09.06 先开 T1,发现把每个特殊串离散化完了再直接做 LIS 板子就是 \(O(n^2)\),光速写完。 开 T2,发现是最优化,扫了一眼数据范围,感觉很贪心,但是不太会所以跳了。 开 T3,这不是建完前缀和再直接用树状数组做二…

PCIe从入门到精通之十八:PCIe设备的初始化枚举过程2

0&#xff0c;引言 在上一篇文章《PCIe从入门到精通之十七&#xff1a;PCIe设备的初始化枚举过程1》中&#xff0c;我们介绍了PCIe设备的初始化枚举过程一些概念.这一篇我们将具体介绍PCIe设备的初始化枚举一步一步的动态过程&#xff0c;以及Primary Bus Number Register&…

CF1615B 题解

Codeforces 1615B And Its Non-Zero 题解 题目传送门: 洛谷 CF 思路 暴力思路 要让所有元素按位与的结果不为 \(0\),就要让所有元素在二进制的某一位都为 \(1\)。 所以我们可以枚举每个二进制位,看看有几个 \(0\),…

1.hello驱动

1.怎么写驱动程序确定主设备号 定义自己的file_operations结构体 实现对应的open/read/write等函数,填入file_operations结构体 把file_operations结构体告诉内核:注册驱动程序(register_chrdev(major, file_operat…

2025冬 超级无敌挂分大王

11.12 分层测试~ 开 T1,MST 板题?写了一下,最后用大法师求根到点的边权和。炸。瞎改了一堆。炸炸炸。 无语,滚去 T2。怎么是类 CSPS T1,瞎猜了个基于优先队列的贪心,因为不会写堆所以改写线段树,胡写了一下,大…

文科核心期刊发表指南:AI助力高效投稿

8大文科论文查重工具核心对比 排名 工具名称 查重准确率 数据库规模 特色功能 适用场景 1 Aicheck 98% 10亿文献 AI降重、AIGC检测 初稿查重与修改 2 Aibiye 96% 8亿文献 智能改写、格式调整 终稿精细优化 3 秒篇 95% 6亿文献 一键生成降重报告 快速查…

Agentic-KGR:多智能体强化学习驱动的知识图谱本体渐进式扩展技术

Agentic-KGR是一种通过多轮强化学习驱动的多智能体交互实现知识图谱本体渐进式自进化的技术框架。该框架遵循"提取→暂存→更新→奖励计算→晋升"的闭环流程&#xff0c;依赖LLM的知识发现能力和反馈闭环机制。系统通过多尺度提示压缩、Neo4j数据库管理、分层决策机制…

教师必看!国内发成绩小程序大盘点

教师必看!国内发成绩小程序大盘点引言:成绩发布痛点与小程序崛起 每到期中期末考试结束,便是老师们的 “成绩发布攻坚战”。传统的成绩发布方式,简直是问题百出。手动录入成绩,那密密麻麻的数字,一不留神就可能输…

瞬维智能:房产获客的精准革命,让每一份投入都开出确定的花

在房产行业摸爬滚打的人&#xff0c;都曾经历过这样的时刻&#xff1a;深夜对着电脑屏幕&#xff0c;反复修改房源文案却始终触不到那个“对的人”&#xff1b;或是花费大量人力物力制作的内容&#xff0c;最终却石沉大海&#xff0c;连个水花都没溅起。 瞬维智能的AI获客智能体…

学Simulink--电机控制架构与算法实现​场景示例:基于Simulink的电机电流环PI参数整定仿真

目录 手把手教你学Simulink 一、引言:为什么“调不好PI”会让高性能电机变成“抖动机器”? 二、核心原理:电流环的“等效传递函数”建模 1. 电流环简化模型(d/q轴解耦后) 2. 数字控制系统中的关键延迟 3. 电流环闭环结构 三、应用场景:伺服驱动器中的高性能电流环设…

稀土合金回收利用:资源闭环新路径,产业盈利与环保双赢

稀土被誉为“现代工业的维生素”,稀土合金更是新能源、航空航天、高端制造领域的核心材料,不可或缺。但原生稀土储量有限、开采污染大,随着全球稀土需求激增,稀土合金回收利用已成为缓解资源缺口、践行双碳目标、提…

P6822 [PA 2012 Finals] Tax 题解

题目大意 可恶,我们老师竟然把紫题放到了模拟赛里。 题目传送门 原题中题意说的很清楚了。 思路 转化问题 首先先新建两条边,使原题点到点的问题转化成边到边的问题。 可以连接一条从 \(0\) 到 \(1\),长度为 \(0\) …

基于Springboot+Vue的校园二手书交易系统(源码+lw+部署文档+讲解等)

课题介绍 本课题针对校园内二手书流转不畅、交易信息分散、供需对接低效、交易安全缺乏保障等痛点&#xff0c;设计并实现基于SpringbootVue的校园二手书交易系统&#xff0c;构建集图书发布、检索匹配、在线沟通、交易履约于一体的数字化校园交易平台。系统以MySQL为数据存储核…