优先级队列(哈夫曼树)poj3253

题目链接:http://poj.org/problem?id=3253

题目解析:根据Hint提示我们可知,就是求锯木段的最小费用;而每次锯木段的费用就是锯下的木段的长度,那么自然就是短的先搞定。

                   以案例中的 8 5 8为例,先从无限长的木板上锯下长度为21的木板,然后要求分成3部分,此时:

                  (1)从21的木板锯下长度为5的木段,cost=21+5;

                  (2)从16的木板锯下长度为8的木段,cost=21+5+8;

                  (3)最后剩下的木段就不要裁剪了。所以totalcost=34;

算法:构造哈夫曼树,队列中取出最小的两个数放在底层,它们的和入队,如此反复;可以利用优先队列priority_queue

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct cmp{   //整形最小优先队列
	bool operator()(const int &a,const int&b){  
		return a>b;
	}
};
int main(){
	int n;
	while(cin>>n){
		priority_queue<__int64,vector<__int64>,cmp>Queue;
		for(int i=1;i<=n;i++){
			__int64 temp;
			cin>>temp;
			Queue.push(temp);
		}
		__int64 mincost=0;
		while(Queue.size()>1){
			__int64 a=Queue.top();
			Queue.pop();
			__int64 b=Queue.top();
			Queue.pop();
			Queue.push(a+b);
			mincost+=a+b;
		}
		cout<<mincost<<endl;
		while(!Queue.empty())
			Queue.pop();
	}
	return 0;
}

//Queue.empty()判断队列是否为空,返回ture表示空,返回false表示非空;
//Queue.top()  返回顶端元素的值,元素还在队列里;
//Queue.pop()  删除顶端元素;
//Queue.push(temp) 把元素temp加入到队列中;
//Queue.size() 返回队列里的元素个数


 

 

你可能感兴趣的:(优先级队列(哈夫曼树)poj3253)