贪心:花最少的代价切分整块金条

题目描述:

一块金条切成两半, 是需要花费和长度数值一样的铜板的。 比如长度为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构建哈夫曼树,则构建过程如下:

贪心:花最少的代价切分整块金条_第1张图片

其中花费的代价就是非叶子节点的值,也就是上图中加黑的数值,30+60=90.

咱们可以自顶向下观察,给您一个60的整块金条按照要求得到{10,20,30},可以第一刀切分为30+30,花费60,第二次切分为10+20=30,花费30,共花费60+30=90.

所以这个题目可以采用小根堆来做,每次取小根堆的最小两个数,使用结束后再把相加得到的花费加入小根堆,以此循环,直到小根堆只有一个数。

代码:

贪心:花最少的代价切分整块金条_第2张图片

 

你可能感兴趣的:(刷题)