牛牛算数题解
题解
首先我们可以把c提出来。
然后我们考虑既然我们一定要计算出一个总答案,我们如何才能最小化花费呢?
我们贪心的考虑,是不是每次选取最小的两个数字合并会花费最小呢?
举一个例子,比如:有a,b,d三个数,c为100
最后结果为:ans = ((a + b) * 100 + d) * 100= (a + b) * 10000 + d*100
表明越先选取的数字他所乘积的权重越大。所以先选小的好。所以我们只需要通过一个最小堆来维护一下即可。
class Solution { public: /** * 返回一个数字表示输出计算n个数字和的最小花费的时间。 * @param n int整型 表示有n个数。 * @param c int整型 参数c * @param a int整型vector ai表示第i个数的大小 * @return long长整型 */ long long solve(int n, int c, vector<int>& a) { // write code here long long ans=0; priority_queue<long long ,vector<long long >,greater<long long > > h; for (int i=0; i<n; i++) { h.push(a[i]); } long long x,y; for (int i=1; i<n; i++) { x=h.top(),h.pop(); y=h.top(),h.pop(); ans+=(x+y); h.push(x+y); } ans=ans*(long long )c; return ans; } };