给出n个数,现在要将这n个数合并成一个数,每次只能选择两个数a,b合并,每次合并需要消耗a+b的能量,输出将这n个数合并成一个数后消耗的最小能量。
样例
样例 1:
输入: [1,2,3,4]
输出: 19
解释:
合并1和2,代价为3, 合并后为 [3,4,3].
合并3,3, 代价是6, 合并后为 [6,4].
合并最后两个,代价为10, 总最小代价为19
样例 2:
输入: [2,8,4,1]
输出: 25
解释:
合并1和2,代价为3, 合并后为 [3,4,8].
合并3,4, 代价是7, 合并后为 [7,8].
合并最后两个,代价为15, 总最小代价为25
注意事项
2 <= n <= 50000,合并后的数字不会超过int范围
class Solution {
public:
/**
* @param numbers: the numbers
* @return: the minimum cost
*/
int mergeNumber(vector<int> &numbers) {
// Write your code here
priority_queue <int,vector<int>,greater<int>> q;
for (int i = 0; i < numbers.size(); i++) {
q.push(numbers[i]);
}
int res=0;
int sum=0;
while(!q.empty()&&q.size()>=2)
{
int num1=q.top();
q.pop();
int num2=q.top();
q.pop();
//int sum+=num1+num2;
res+=num1+num2;
q.push(num1+num2);
}
return res;
}
};