追逐影子的人,自己就是影子。 ——荷马

达达最近迷上了文学。

她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。

但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,达达想通过一种编码方式使得它变得短一些。

一部《荷马史诗》中有 nn 种不同的单词,从 11 到 nn 进行编号。其中第 ii 种单词出现的总次数为 wiwi。

达达想要用 kk 进制串 sisi 来替换第 ii 种单词,使得其满足如下要求:

对于任意的 1≤i,j≤n,i≠j1≤i,j≤n,i≠j,都有:sisi 不是 sjsj 的前缀。

现在达达想要知道,如何选择 sisi,才能使替换以后得到的新的《荷马史诗》长度最小。

在确保总长度最小的情况下,达达还想知道最长的 sisi 的最短长度是多少?

一个字符串被称为 kk 进制字符串,当且仅当它的每个字符是 00 到 k−1k−1 之间(包括 00 和 k−1k−1)的整数。

字符串 Str1Str1 被称为字符串 Str2Str2 的前缀,当且仅当:存在 1≤t≤m1≤t≤m,使得 Str1=Str2[1..t]Str1=Str2[1..t]。

其中,mm 是字符串 Str2Str2 的长度,Str2[1..t]Str2[1..t] 表示 Str2Str2 的前 tt 个字符组成的字符串。

注意:请使用 6464 位整数进行输入输出、储存和计算。

输入格式

输入文件的第 11 行包含 22 个正整数 n,kn,k,中间用单个空格隔开,表示共有 nn 种单词,需要使用 kk 进制字符串进行替换。

第 2∼n+12∼n+1 行:第 i+1i+1 行包含 11 个非负整数 wiwi,表示第 ii 种单词的出现次数。

输出格式

输出文件包括 22 行。

第 11 行输出 11 个整数,为《荷马史诗》经过重新编码以后的最短长度。

第 22 行输出 11 个整数,为保证最短总长度的情况下,最长字符串 sisi 的最短长度。

数据范围

2≤n≤1000002≤n≤100000,
2≤k≤92≤k≤9
1≤wi≤10121≤wi≤1012

输入样例:

4 2
1
1
2
2

输出样例:

12
2

题意:有一个 k 叉树,每次合并k个数,不能凑齐k个数的用0补充
条件1:使得最终合并的权值最小
条件2:深度最小:

1:若要满足第一个条件:
{
    1:将树的权值从小到大排序,先合并权值最小的节点,然后在合并权值较大的节点
    2:若根节点不满足k个数,则把深度最深的点补齐, 其他的点用0填补,这样才满足权值最小
    即需要满足n - m * (k - 1) = 1整理得:
    n - 1 = m * (k - 1)即-> (n - 1) % (k - 1) = 0; (n为总的节点个数, k为每次合并k个数, m是合并得次数)
    这个公式如何得来??
    因为共有n个节点,合并k个数树得节点就会变为n - (k - 1), 需要合并m次,则n - m * (k - 1),
    最后的1是因为,最后如果根节点所连的数不是k个则需要用深度最深,即权值最小的补齐,所以根节点
    必需满足他的子节点有k个,他的子节点合并后只有一个节点所以n - m * (k - 1) = 1;
}

2:若要满足第二个条件:两个节点的权值相等则最先合并权值深度最浅的数
{
    1:假设有两个权值一样的节点a, b他们的深度分别
    是x, x + 1则先合并a后的深度是x + 1, 而先合并b后的深度是x + 2我们要求的是最小深度,
    
    2:其次,因为我们是从树的最深的节点开始合并,而深度最深的点影响整个树的深度最大
    原因如图:假设a, b, c权值相等, 若合并a, b, c则树的深度将会变为4,但是若把c移动到
    如图紫色箭头的位置即根节点的下方,则树的深度为3
    
}

代码如下:

#include <queue>
#include <queue>
#include <vector>
#include <iostream>using namespace std;typedef long long LL;
typedef pair<LL, int> PLI;int main()
{int n, k;cin >> n >> k;priority_queue<PLI, vector<PLI>, greater<PLI>> heap;//双关键字排序先按权值最小的排序,//若权值相同再按深度最小的排序for (int i = 0; i < n; i ++ ){LL x;scanf("%lld", &x);heap.push({x, 0});//初始时的深度都为0}while ((n - 1) % (k - 1)) //确保根节点有k个数可配对{heap.push({0, 0});n ++ ;}LL res = 0;while (heap.size() > 1){LL s = 0;int depth = 0;for (int i = 0; i < k; i ++ )//每次合并k个子节点{auto t = heap.top();heap.pop();depth = max(depth, t.second + 1);s += t.first;}res += s;//将所有子节点权值记录heap.push({s, depth});//将子节点的和合并构成一个根节点。}cout << res << endl << heap.top().second << endl;return 0;
}

《算法竞赛进阶指南》 荷马史诗相关推荐

  1. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  2. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  3. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  4. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  5. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  6. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  7. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  8. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  9. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

  10. 算法竞赛进阶指南0x3A 博弈论之SG函数

    算法竞赛进阶指南0x3A 博弈论之SG函数

最新文章

  1. 主席树 ---- CF 1422F. Boring Queries(由离线推出在线如何求的 ,求解多次询问的区间LCM)
  2. c++对象模型-虚拟析构函数
  3. zabbix--分布式监控proxy
  4. canvas.translate(x,y)
  5. pb90代码如何连接sql2008r2_如何使用 HTTP Headers 来保护你的 Web 应用
  6. 下班啦!做那么多老板不会心疼你的
  7. 面向对象设计的重要原则:SOLID
  8. 徐扬:互联网营销下的移动营销
  9. Stateflow子状态激活条件下迁移有效
  10. 工厂支持多数据库开发的三层结构模式随笔(一)
  11. 个人财务软件java_个人账务管理系统java
  12. 计算机双人游戏玩不了,PC上的双人单机游戏
  13. AutoSAR入门到精通讲解 (AppL) 2.1 AutoSAR-CP AppL概述
  14. Python正在慢慢褪色
  15. MapReduce论文中文版--The Google File System
  16. umi+dva dva全局的dispatch方法
  17. linux常用命令_Linux常用命令 unzip
  18. JustifyTextView 解决TextView中英文混排排版问题,android文字排版不齐,
  19. 重估2020:“黑天鹅”催生的AI新业态
  20. 匿名科创无人机学习心得

热门文章

  1. “黑盒工坊”,轻松管理《魔兽世界》插件!
  2. 【Ubuntu】基于 Ubuntu 搭建 Discuz 论坛
  3. 写会议纪要也是需要水平滴
  4. Luogu3403: 跳楼机
  5. Source Insight 4.0日常操作指南二
  6. Masimo宣布Rad-G™ with Temperature通过CE认证
  7. 解决 Please use the NLTK Downloader to obtain the resource
  8. ctc系统通信前置服务器,CTC系统包括哪些接口服务器?
  9. sre工程师_什么是SRE? 现场可靠性工程师的重要作用
  10. 卸载360天擎-奇安信