题目
一块金条切成两半, 是需要花费和长度数值一样的铜板的. 比如长度为 20 的 金条, 不管切成长度多大的两半, 都要花费 20 个铜板. 一群人想整分整块金条, 怎么分最省铜板?
例, 给定数组 {10,20,30}, 代表一共三个人, 整块金条长度为 10 + 20 + 30 = 60 . 金条要分成 10, 20, 30 三个部分.
- 如果先把长度
60的金条分成10和50, 花费60再把长度50的金条分成20和30, 花费50, 一共花费110铜板. - 如果先把长度
60的金条分成30和30, 花费60再把长度30金条分成10和20,花费30一共花费90铜板.
输入一个数组, 返回分割的最小代价.
题解

如图, 该问题可看作哈夫曼树, 树中的叶结点即为最终的划分结果, 相当于给了叶结点, 求什么情况下非叶结点的和最小. 可采用贪心算法, 利用堆结构. 将所有节点存入小根堆中. 每次依次弹出两个元素, 求和, 并将和放回小根堆中, 循环计算即可得到最小值.
Java
1 | import java.util.PriorityQueue; |
Python
1 | from heapq import * |