关于Huffman树:
大概就是那样子吧。
是这样的:对于最多只能有k个叉的树,我们想要使得∑val(i) * deep(i)最大
那么我们补0后建立小根堆即可。
最典型例题:合并果子。
然后是这个:
1 /************************************************************** 2 Problem: 4198 3 Language: C++ 4 Result: Accepted 5 Time:1032 ms 6 Memory:3896 kb 7 ****************************************************************/ 8 9 #include <cstdio> 10 #include <queue> 11 const int N = 100010; 12 typedef long long LL; 13 inline void max(LL &a, LL b) { 14 if(a < b) a = b; 15 return; 16 } 17 struct Node { 18 LL val, p; 19 bool operator < (const Node &x) const { 20 if(val != x.val) { 21 return val > x.val; 22 } 23 return p > x.p; 24 } 25 }; 26 27 std::priority_queue<Node> Q; 28 29 Node mk(LL v, LL p) { 30 Node ans; 31 ans.val = v; 32 ans.p = p; 33 return ans; 34 } 35 36 int main() { 37 LL n, k, v; 38 scanf("%lld%lld", &n, &k); 39 for(int i = 1; i <= n; i++) { 40 scanf("%lld", &v); 41 Q.push(mk(v, 0)); 42 } 43 while((n - 1) % (k - 1) != 0) { 44 Q.push(mk(0, 0)); 45 n++; 46 } 47 48 LL ans = 0; 49 50 for(int i = 1; i <= (n - 1); i += (k - 1)) { 51 LL p = 0; 52 v = 0; 53 for(int j = 1; j <= k; j++) { 54 Node nd = Q.top(); 55 Q.pop(); 56 max(p, nd.p); 57 v += nd.val; 58 } 59 ans += v; 60 Q.push(mk(v, p + 1)); 61 } 62 LL p = Q.top().p; 63 printf("%lld %lld", ans, p); 64 return 0; 65 }