Description
小明发现单吃一种药效果太差,他要将已有的N种药物混合成1种药再吃。已知每种药都有一定的毒性,将任意两种药混合的毒性为这两种药的毒性之和,混合产生的新药的毒性也同样为两种药的毒性之和。由于技术限制,小明每次只能挑选两种药进行混合。现在小明想知道将N种药合成1种药的最小毒性和。
Input
输入第一行为一个正整数N(1 <= N <= 100000)
接下来一行输入N个正整数,第i个整数a[i]代表第i种药的毒性( 1 <= a[i] <= 1000)
Output
输出一行一个整数,代表药的最小毒性和。
Sample Input
5
1 2 3 4 5
Sample Output
33
这题属于合并果子里的经典问题,思路是贪心,堆(优先队列)。
建堆O(n) (T(n)=T(n/2)+O(n)) 插入,删除操作O(logn).
不懂记得按关键词来百度学习~
#include <iostream>
#include <queue>
using namespace std;
priority_queue <int, vector<int>, greater<int> >q;
int main(void) {
int n, t, c1, c2, ans = 0;
cin >> n;
while(n--) q.push((cin >> t, t));
while(q.size() != 1) {
c1 = q.top(), q.pop();
c2 = q.top(), q.pop();
ans += (c1 + c2);
q.push(c1 + c2);
}
cout << ans << endl;
return 0;
}