关于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 }
AC代码

相关文章:

  • 2021-08-26
  • 2022-12-23
  • 2021-05-25
  • 2022-12-23
  • 2021-08-20
  • 2021-10-12
  • 2021-06-24
  • 2021-12-31
猜你喜欢
  • 2022-02-17
  • 2021-12-20
  • 2021-06-15
  • 2022-12-23
  • 2022-12-23
  • 2022-01-05
相关资源
相似解决方案