題目:有很多籬笆,每次把兩個籬笆合起來,代價使他們的長度,求所有籬笆合起來的最小代價。
分析:貪心,哈弗曼樹。直接利用優先隊列求解哈弗曼樹即可。
說明:數學和算法被鄙視了╮(╯▽╰)╭。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <queue>
using namespace std;
int main()
{
int n, leaf, small1, small2;
while (~scanf("%d",&n)) {
priority_queue<int,vector<int>,greater<int> > Q;
for (int i = 0; i < n; ++ i) {
scanf("%d",&leaf);
Q.push(leaf);
}
long long sum = 0LL;
if (Q.size() == 1) {
sum = Q.top();
}else {
while (Q.size() > 1) {
small1 = Q.top();Q.pop();
small2 = Q.top();Q.pop();
Q.push(small1+small2);
sum = sum + small1+small2;
}
}
printf("%lld\n",sum);
}
return 0;
}