题目链接:题目链接:http://poj.org/problem?id=3253
题目大意:锯木头,你怎样分配才能让锯木头的花费最少。
写在前边:暑假刷题中,思路解释可能不是特别清楚。
题目思路:将一块木头分解为n快的最小花费,那么我们不妨倒过来,把n块木头拼成一块的最小花费,这就转化成了优先队列的问题,动态维护一个优先队列,这样就能求解出相应的解。这个题目还可以运用huffman的思路。
代码:
#include <queue>
#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long
struct node
{
ll x;
bool operator<(const node&a)const{
return a.x<x;
}
};
int main()
{
priority_queue<node>q;
int n;
while(~scanf("%d",&n)){
while(n--){
node tmp;scanf("%I64d",&tmp.x);
q.push(tmp);
}
ll ans=0;
while(q.size()>1){
node tmp;
tmp.x=0;
tmp.x+=q.top().x;q.pop();
tmp.x+=q.top().x;q.pop();
ans+=tmp.x;
q.push(tmp);
}
printf("%I64d\n",ans);
q.pop();
}
}