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;
}

posted on 2011-05-09 12:05  宇宙吾心  阅读(193)  评论(0)    收藏  举报

导航