一道不需要写的“二分”题——7-7 修理牧场(25 分)

最近每天都在肛pta,没什么心思写博客,突然看到这个题,觉得值得一写。

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li的总和。

但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。

请编写程序帮助农夫计算将木头锯成N块的最少花费。


其实就是一道脑洞题

答案的话很简单,优先队列每次将两个最小的和在一起入队就行了。但,为什么是这样的一种思路呢?

想这样一个问题:第一刀怎么切,才会使最后的结果变小呢?当然是取一半切了啊,这样在接下来每一次切的时候,面对的就是一半的花费。然后每次都取一半一直切切切……但这样的思路有点蛋疼,为什么呢?思考一下如何写这个代码呢?木头并不一定能凑成完美一半一半的状态,每次次切都要看这一刀是不是在较为靠近中间的位置,这样的思路有一点不明智。换一个角度看,我把这些木头粘在一起的过程是不是也要选择长度相等呢?没错!这样的思路还有一个好处就是你可以很容易的选择第一次要做的事情:把两根最小的粘在一起。想到这里,这道题就很简单了。代码量比大多数20分的题代码量还要少。

(pta上比较精华的题之一!)

你可能感兴趣的:(一道不需要写的“二分”题——7-7 修理牧场(25 分))