poj 3253
题目就是给一块木板,它有一个长度,现在要把它据成一个个指定长度的木板,但每次锯一块木板的时候要收取木板长度那么多钱。现在给定小木板的个数,以及每个小木板的长度,问从一个全长为所有木板和的木板锯成这些小木板,需要交的最少金额是多少。
算法:这题其实就是让你构造哈夫曼树,这样的代价是最小的。但我们不必真的去构造哈夫曼树,我们只需要了解我们在树 中要得到的东西就行了。在这题中我们需要从哈夫曼树的最底层的子树根结点值开始加起,每次只加根结点的值,一直走到总根结点就行,也就是说,每次取最小的 两个数相加。可以用优先队列实现。
代码:
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
struct e{
long long s;
friend bool operator <(e a, e b){
return a.s>b.s;
};
};
int n;
void read(){
// ifstream cin("in.txt");
long long i,j,k;
priority_queue<e> q;
cin>>n;
e b;
for(i=1;i<=n;i++)
{
cin>>b.s;
q.push(b);
}
long long ans=0;
while(1){
k=q.top().s;
q.pop();
if(q.empty())
break;
k+=q.top().s;
q.pop();
ans+=k;
b.s=k;
q.push(b);
}
cout<<ans<<endl;
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号