荷马史诗(算法竞赛进阶指南 P81,K 叉哈夫曼树)

一.题目链接:

荷马史诗

二.题目大意:

给出每个单词的出现次数.

现要求用 k 进制数设计前缀编码.

使得文章总长度最小.

输出文章总长度的最小值和最长单词编码的最小长度.

三.分析:

很容易想到哈弗曼树.

这里是 k 叉哈弗曼树,对应 0 ~ k - 1.

有一点需要注意:初始有 n 颗树,每次合并会减少 k - 1 棵树.

为了方便,可以加入若干个 0 节点,使得 (n - 1) % (k - 1) == 0.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
using namespace std;

const int M = (int)1e5;
const int mod = 99991;
const int inf = 0x3f3f3f3f;

priority_queue < pair<ll, ll> > q;

int main()
{
    int n, k;
    scanf("%d %d", &n, &k);
    ll x;
    for(int i = 0; i < n; ++i)
    {
        scanf("%lld", &x);
        q.push(make_pair(-x, 0));
    }
    while((n - 1) % (k - 1))
    {
        n++;
        q.push(make_pair(0, 0));
    }
    ll sum = 0, w, h;
    while(q.size() != 1)
    {
        w = h = 0;
        for(int i = 0; i < k; ++i)
        {
            w += q.top().first;
            h = min(h, q.top().second);
            q.pop();
        }
        sum += w;
        q.push(make_pair(w, h - 1));
    }
    printf("%lld\n%lld\n", -sum, -q.top().second);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Proteus"是一个虚构的学校,它并没有出现在某本特定的书中。然而,"Proteus"这个名字在文学和文化中有多个涵义。在奥维德的史诗《变形记》中,Proteus是一个海洋之神,他能变化成不同的形态。在乔伊斯的小说《尤利西斯》,Proteus是主人公之一史蒂芬的昵称。此外,在现代科学和医学中,"Proteus"也是指一种细菌,它具有一种特殊的能力,能够变形来逃避免疫系统的攻击。总的来说,"Proteus"并没有单一的来源,而是在不同作品和学科中具有不同的含义。 ### 回答2: Proteus并不是一本书,而是一个在希腊神话中的神灵。根据《荷马史诗》中的描述,Proteus是巴勒摩尼亚岛上海神的儿子,也是一位智慧与变化之神。他是一位非常聪明与善变的神灵,可以根据他的意愿改变形象。 虽然Proteus在大学并没有特定的教学书籍,但他在希腊神话中的形象与故事在古代文学、历史学或神话学的课程中被广泛学习和探讨。在这些课程中,学者和学生们可以学习关于Proteus的起源、角色和他在古希腊文化中的意义。 此外,Proteus的形象和象征也经常在现代文学、音乐、艺术等领域中被引用和描绘。因此,对于对文化和艺术的研究有兴趣的人们也可以在相关的书籍和研究中找到有关Proteus的资料和讨论。 总之,Proteus虽然在大学中没有特定的教材或专门学习的书籍,但可以通过学习希腊神话、古代文化和相关研究领域中的书籍和课程,了解和深入探究他的神话形象和文化意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值