题目链接:http://poj.org/problem?id=3253
合并N块木板,每次合并木板的代价为两块木板的长度之和。求将N块木板合成1块木板的最小代价。
大水题。。。
哈夫曼编码的思想,优先队列的应用。
注意,数据应该定义为LL型。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<vector>
#include<map>
#include<list>
#include<set>
#include<queue>
#define LL long long
using namespace std;
const int maxn=1005,maxe=100005,inf=1<<29;
int n,m;
struct node
{
LL x;
bool operator <(const node &a) const
{
return x>a.x;
}
};
int main()
{
while(~scanf("%d",&n))
{
priority_queue<node>q;
for(int i=0;i<n;i++)
{
LL x;
scanf("%lld",&x);
node t={x};
q.push(t);
}
LL ans=0;
while(q.size()>1)
{
node a=q.top();
q.pop();
node b=q.top();
q.pop();
ans+=a.x+b.x;
node t={a.x+b.x};
q.push(t);
}
printf("%I64d\n",ans);
}
return 0;
}