贪心:花最少的代价切分整块金条
题目描述:
一块金条切成两半, 是需要花费和长度数值一样的铜板的。 比如长度为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铜板。输入一个数组, 返回分割的最小代价。
解析:
这个问题可以使用贪心思想解决。如果我们熟悉哈夫曼编码的话,应该很好理解。例如有10,20,30构建哈夫曼树,则构建过程如下:
其中花费的代价就是非叶子节点的值,也就是上图中加黑的数值,30+60=90.
咱们可以自顶向下观察,给您一个60的整块金条按照要求得到{10,20,30},可以第一刀切分为30+30,花费60,第二次切分为10+20=30,花费30,共花费60+30=90.
所以这个题目可以采用小根堆来做,每次取小根堆的最小两个数,使用结束后再把相加得到的花费加入小根堆,以此循环,直到小根堆只有一个数。
代码: