題目鏈接:點擊打開鏈接
將木板切下,每次切的花費爲切下的長度,求最小花費。
用哈夫曼思想就是,每次找兩個最小的合成一個,再放進隊列,直到剩下最後一個。
//448K 16MS
//C++ 589B
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
struct cmp
{
bool operator ()(const long long int &a,const long long int &b)const
{
return a>b;
}
};
int main()
{
priority_queue<long long int,vector<long long int>,cmp> q;
int i,j,n;
long long int sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&j);
q.push(j);
}
while(q.size()>1)
{
int a=q.top();
q.pop();
int b=q.top();
q.pop();
sum+=a+b;
q.push(a+b);
}
printf("%lld\n",sum);
}