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

题解:洛谷 P1090 合并果子

【题目来源】

洛谷:P1090 [NOIP 2004 提高组] 合并果子 - 洛谷(luogu.com.cn)

【题目描述】

在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 \(n-1\) 次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 \(1\) ,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

例如有 \(3\) 种果子,数目依次为 \(1\)\(2\)\(9\)。可以先将 \(1\)\(2\) 堆合并,新堆数目为 \(3\) ,耗费体力为 \(3\)。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 $12 $,耗费体力为 $12 $。所以多多总共耗费体力 \(=3+12=15\)。可以证明 \(15\) 为最小的体力耗费值。

【输入】

共两行。第一行是一个整数 \(n(1\le n\le 10000)\) ,表示果子的种类数。

第二行包含 \(n\) 个整数,用空格分隔,第 \(i\) 个整数 \(a_i(1\le a_i\le 20000)\) 是第 \(i\) 种果子的数目。

【输出】

一个整数,也就是最小的体力耗费值。输入数据保证这个值小于 \(2^{31}\)

【输入样例】

3
1 2 9

【输出样例】

15

【核心思想】

  1. 问题分析:给定 \(n\) 堆果子,每次合并两堆,耗费体力为两堆重量之和。求合并成一堆的最小总耗费。这是一个哈夫曼编码(Huffman)问题,关键在于每次选择重量最小的两堆合并,使大重量堆尽可能少参与合并。

  2. 算法选择

    • 贪心策略(哈夫曼算法):每次选择当前重量最小的两堆合并,新堆重量入队,重复直至只剩一堆
    • 小根堆(优先队列)\(O(\log n)\) 获取最小值,\(O(\log n)\) 插入新值
  3. 关键步骤

    • 读入数据\(n\)\(n\) 堆果子的重量,全部入小根堆
    • 贪心合并(堆中元素 \(> 1\) 时循环):
      • 取出最小堆 \(a\) 和次小堆 \(b\)
      • res += a + b
      • a + b 入堆
    • 输出 res
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n \log n)\),每次堆操作 \(O(\log n)\),共 \(n-1\) 次合并
    • 空间复杂度:\(O(n)\),小根堆
  5. 哈夫曼贪心策略的核心思想

    • 局部最优性:每次合并最小的两堆,保证当前步骤耗费最小
    • 全局最优性:通过交换论证可证明,任何非贪心选择都可以通过调整为贪心选择而不增加总耗费
    • 大重量堆的延迟合并:重量大的堆应尽量少参与合并(每次合并都会累加其重量到总耗费),贪心策略确保大堆在后期才被合并,参与次数最少
    • 小根堆的高效性:排序后数组插入需要 \(O(n)\),小根堆将插入降为 \(O(\log n)\),是标准实现
    • 适用于"最小代价合并"问题,核心在于哈夫曼贪心策略的正确性证明和小根堆的高效实现

【解题思路】

【算法标签】

普及 #贪心

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int n, ans=0;
int a[10005] ={0};
int main()
{cin >> n;  // 输入nfor (int i=0; i<n; i++)   // 输入n堆果子的重量cin >> a[i];sort(a, a+n);  // 按照从小到大方式排序for (int i=1; i<n; i++)   // 遍历n堆果子{ans += a[i-1] + a[i];  // 统计两堆之和a[i] = a[i-1] + a[i];  // 将两堆之和赋值给当前堆for (int j=i+1; j<n; j++)   // 将当前苹果堆插入到后面的苹果中,按照重量小的排前面的方式if (a[j-1] > a[j]) swap(a[j-1], a[j]);}cout << ans << endl;  // 输出总重量return 0;
}
// 使用小根堆再做一遍
#include <bits/stdc++.h>
using namespace std;
int n, a[10005], res;
priority_queue<int, vector<int>, greater<int> > q;  // 小根堆
int main()
{cin >> n;for (int i=1; i<=n; i++) {int x;cin >> x;q.push(x);}int res = 0;while (q.size()>1) {int a = q.top(); q.pop();int b = q.top(); q.pop();res += a+b;q.push(a+b);}cout << res << endl;return 0;
}

【运行结果】

3
1 2 9
15
http://www.jsqmd.com/news/1365835/

相关文章:

  • ROS2参数系统详解:分布式配置与高效管理
  • 2026衡阳新房装修公司推荐:口碑品牌怎么选? - 品牌优企推荐
  • 2026加拿大留学移民中介全链路评测:学签转PR全程对标,星旅途移民99.3分登顶 - 互联网科技品牌测评
  • 北京AI搜索优化公司|2026年AI-GEO优化服务商选择指南(附FAQ)盘点
  • Godot引擎多语言本地化实战:从零构建全球游戏的技术方案
  • 慕朗家居北美黑胡桃五大系列成品整装定制 - GrowthUME
  • 告别遥控器困境:TV Bro如何让智能电视浏览网页变得轻松愉快
  • 【C++初阶】速过C++语法基础
  • 如何选择可靠的linux核心板?浙江启扬智能科技有限公司深度解析 - 品牌报告
  • 2026加拿大移民中介**评测:持牌资质+全案能力双对标,星旅途移民99.2分登顶 - 互联网科技品牌测评
  • AI视频生成实战:从创意到成片的低成本广告制作全流程
  • 3分钟掌握音乐格式转换技巧:解锁加密音频的完整指南
  • Legacy iOS Kit技术深度解析:iOS设备降级与系统恢复的底层实现原理
  • 2026 年现阶段越秀值得关注的美甲移印机生产厂家哪家好,美甲店小姐姐靠这玩意儿,半天能接二十个单还不磨手? - 企业推荐管【认证】
  • WindowsCleaner终极指南:如何快速彻底解决C盘空间不足问题
  • 抖音批量下载终极指南:如何高效获取无水印短视频内容
  • 宝塔面板快速部署Redis与Node.js集成开发实战指南
  • 佛山性价比高的企业画册哪个靠谱 - GrowthUME
  • 2026年8月温州代理记账公司推荐 - 品牌优企推荐
  • 运动团建行业深度解析:体验式教育赋能企业组织效能的理论与实践 - GrowthUME
  • Django 路由组织、名称空间与虚拟环境
  • 暗黑破坏神2存档编辑器终极指南:免费可视化修改工具完全手册
  • 聚焦搜索整合通义千问:开发者如何利用系统级AI提升工作流效率
  • 机器人量产最后一公里
  • Rust 标准库 `std` 中最常用、最核心的模块和类型
  • 北京团建公司哪家口碑好?HR圈真实评价与验证方法全解析 - 陀螺团建
  • 终极WindowResizer指南:如何强制调整Windows窗口大小解决三大痛点
  • SuperMap空间关系分析在三维GIS属性管理中的应用
  • 2026年气弹簧品牌推荐厂家盘点,优质选择助你轻松选购 - GrowthUME
  • 高效解决WeMod/Wand客户端限制的WandEnhancer技术方案实现