题目链接
题目梗概
先要把若干数字相加成一个数字,相加时,只能先两两相加,相加的耗费为当前两个加数之和。如:1与4相加,耗费即为5。
问,当给出一组数字后,把他们最终相加成一个数,所需要的最小耗费为多少。
解题思路
先合并的数字,会在之后的合并中多次重复计算到耗费中,先合并的数字越小,总耗费越少。
我们从简单情况入手来理解,比如三个,a b c。假定合并的次序为a+b = d, d+c = e
,那么耗费即为d+e = d + (d+c) =2(a+b)+c
;可以看到先合并a与b多加了一次,只有当a+b越小时,这三个数合并的耗费越低。其他数量的数字也是同理。
策略就是,每次把当前最小的两个数字相加。
这里采用C++ STL中的优先队列实现,它可以进行队列操作,同时内部会对元素进行排序(堆排序)。用在本题非常方便。
完整代码
#include <iostream>