题目链接:http://poj.org/problem?id=3253
题意:给出n个木棒长度,从无限长的木棒上锯断n-1次,每次锯断需要花费的代价为木棒的长度,求最小代价。
思路:Huffman树求最小权值的问题,用优先队列可以很方便的解决这道题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=10010;
typedef __int64 LL;
LL n,x;
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
#endif
while(~scanf("%I64d",&n)){
priority_queue<LL,vector<LL>,greater<LL> >q;
for(int i=0;i<n;i++){
scanf("%I64d",&x);
q.push(x);
}
LL sum=0;
if(q.size()==1){//注意特判一下1的情况
sum+=q.top();
}
else{
while(q.size()>1){
int a=q.top();q.pop();
int b=q.top();q.pop();
sum+=a+b;
q.push(a+b);
}
}
printf("%I64d\n",sum);
}
return 0;
}