登 录
//构造Huffman Tree,非叶子节点值总和即为结果,用最小优先队列维护 #include<iostream> #include<queue> using namespace std; priority_queue<int,vector<int>,greater<int> > q;//最小优先队列,用greater<int>作为比较函数即可,less<int>则为最大优先队列 int main() { //freopen("in.txt","r",stdin); long long int ans = 0; int n,node,first,second,new_node; scanf("%d",&n); for(int i = 0;i < n;++i) { scanf("%d",&node); q.push(node); } for(int i = 1;i <= n-1;++i)//对于构造n个叶子的Huffman Tree,只需n-1次结点构造,因为Huffman Tree是正则二元树,可以证明结点数目总比叶子数目少1 { first = q.top();q.pop(); second = q.top();q.pop(); new_node = first + second; q.push(new_node); ans += new_node; } printf("%I64d/n",ans);//扑街结果原来是long long int的,还好有Discuss,不然真的不知道怎么老WA!
return 0; }
抱歉!评论已关闭.