POJ3253哈弗曼树的优先队列解法

直接构造优先队列,每次取出最小的两个数相加,直到队列中只有一个数为止,还是用STL过的题。

 

注意priority_queue的用法,原型:

priority_queue<Type> q; priority_queue<Type,deque<Type>,Comp> q;

其中Type是类型,Comp是比较结构体,比较函数是它的括号重载,比如对int型从小到大排序的Comp结构体如下:

struct Comp { bool operator()(const LL& a,const LL&b) const { return a>b; } };

 

这题还要注意使用long long,不然会越界导致WA。

 

我的代码:

#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using namespace std; typedef long long LL; struct Comp { bool operator()(const LL& a,const LL&b) const { return a>b; } }; priority_queue<LL,deque<LL>,Comp> q; void init() { LL n,a; while(!q.empty()) q.pop(); scanf("%lld",&n); while(n--) { scanf("%lld",&a); q.push(a); } } LL run() { LL ret=0; LL a,b; while(1) { a=q.top(); q.pop(); if(q.empty()) break; b=q.top(); q.pop(); a+=b; ret+=a; q.push(a); } return ret; } int main() { init(); printf("%lld/n",run()); return 0; }

 

总结:做题的时候要注意数字的范围,看清到底要用什么类型,是int还是long long。

你可能感兴趣的:(struct)