题意:
有n个数的集合S,每次可以从集合S中删除两个数,然后把它们的和放回集合,直到剩下一个数。每次操作的开销等于删除的两个数之和,求最小总开销。
题解:
使用STL优先队列,每次取出最小的两个数,再计算其和,push进队列中。其实就是Huffmancode的思想。
代码:
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int main()
{
int n,x;
while(scanf("%d",&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;
}