标签:
http://poj.org/problem?id=3253
其实就是求霍夫曼树的值
每次取最小和次小的值加起来
不断累加直至根节点
用priority_queue
结果可能很大,要用long long
1 #include <stdio.h> 2 #include <queue> 3 #include <functional> 4 using namespace std; 5 6 priority_queue<int, vector<int>, greater<int> > q; //优先队列 7 8 9 int main() 10 { 11 int n; 12 while (scanf("%d", &n) != EOF) 13 { 14 while (!q.empty()) 15 q.pop(); 16 17 for (int i = 0; i < n; i++) 18 { 19 int x; 20 scanf("%d", &x); 21 q.push(x); 22 } 23 24 long long ans = 0; //结果可能很大 25 while (q.size()>1) 26 { 27 int a = q.top(); //最小值 28 q.pop(); 29 int b = q.top(); //次小值 30 q.pop(); 31 32 int t = a + b; 33 ans += t; //结果 34 35 q.push(t); //合并值重新入队 36 } 37 38 printf("%lld\n", ans); 39 } 40 41 return 0; 42 }
标签:
原文地址:http://www.cnblogs.com/iswoit/p/4482080.html