题意:给你一块木板,让你切割成需要的长度,求最小花费。每次切割花费等于木板的原长,即把长度为10的木板切割成两段,则花费为10。
思路:本来觉得是从大到小切,没过,看了网上才发现这是个哈夫曼树,用优先队列即可。
参考:https://blog.csdn.net/u012860063/article/details/34805369
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n;
while(cin>>n)
{
priority_queue<long long,vector<long long>,greater<long long> >q;
long long m;
long long sum=0;
for(int i=0; i<n; i++)
{
cin>>m;
q.push(m);
}
while(q.size()>1)
{
long long a=q.top();
q.pop();
long long b=q.top();
q.pop();
q.push(a+b);
sum+=a+b;
}
cout<<sum<<endl;
}
return 0;
}