给你一堆数 每次可以拿两个数出来相加再放回去 开销为两个数之和求最小开销
本质就是建一棵Huffman树,非叶子结点的权值为两个子节点权值的和(即开销),然后把根结点以外的结点相加就为答案。
实际操作使用能自动排序的优先队列,非常方便。
AC代码:
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int main()
{
int n,x;
while(cin>>n&&n)
{
priority_queue<int,vector<int>,greater<int> >q;
for(int i=0;i<n;i++)
{
scanf("%d",&x);
q.push(x);
}
int ans=0;
for(int i=0;i<n-1;i++)
{
int a=q.top();q.pop();
int b=q.top();q.pop();
ans+=a+b;
q.push(a+b);
}
cout<<ans<<endl;
}
return 0;
}