ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022.3.2#NOI2015 荷马史诗

2022-03-02 19:03:36  阅读:184  来源: 互联网

标签:val 哈夫曼 荷马史诗 ll len NOI2015 int forest 2022.3


2022-03-02

对于哈夫曼树和哈夫曼编码已经有所认识,此题相当于使用多叉树的哈夫曼编码方式。对于k叉树,我们可以不用树形结构而用队列来做,会更方便,哈夫曼编码又需要选择最小的k个值来结合,故我们使用优先队列,在头文件queue中,名为

priority_queue

这个STL的使用方法:

默认从大到小:priority_queue<int> a;

从小到大:priority_queue< int,vector<int>,greater<int> > b;

如果是自定义的数据结构:

struct tmp1
{
    int x;
    tmp1(int a)
         {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; 
    }
};   

注意operator要 < ,优先队列规定的

push():插入至首位

top():首位元素

pop:删除

 

利用优先队列进行哈夫曼编码如下:

 1 #include<iostream>
 2 #include<queue>
 3 #define ll long long
 4 using namespace std;
 5 int n, k;
 6 ll sum;
 7 typedef struct Treecode {
 8     int len;
 9     ll val;
10     Treecode(int _len, ll _val)
11     {
12         len = _len;
13         val = _val;
14     }
15     inline bool operator <(const Treecode &a)const
16     {
17         if (val == a.val)
18             return a.len < len;
19         return a.val < val;
20     }
21 }htree;
22 priority_queue<htree>forest;
23 inline ll read()
24 {
25     ll x = 0;char c = getchar();
26     while (c < '0' || c>'9') c = getchar();
27     while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
28     return x;
29 }
30 int main(void)
31 {
32     int cnt;
33     cin >> n >> k;
34     if ((n - 1) % (k - 1))
35     {
36         cnt = (n - 1) % (k - 1);
37         for (int i = n + 1;i < n + 1 + cnt;i++)
38             forest.push(htree(1, 0));
39     }
40     for (int i = 1;i <= n;i++)
41     {
42         ll a = read();
43         forest.push(htree(1, a));
44     }
45     n += cnt;
46     while (n > 1)
47     {
48         ll ans = 0;
49         int maxlen = 0;
50         for (int i = 0;i < k;i++)
51         {
52             ans += forest.top().val;
53             maxlen = max(maxlen, forest.top().len);
54             forest.pop();
55         }
56         sum += ans;
57         forest.push(htree(maxlen + 1, ans));
58         n = n - k + 1;
59     }
60     cout << sum << endl;
61     cout << forest.top().len - 1;
62     return 0;
63 }

 

标签:val,哈夫曼,荷马史诗,ll,len,NOI2015,int,forest,2022.3
来源: https://www.cnblogs.com/Tiachi/p/15956535.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有