首先这个题很容易想到哈夫曼树,但哈夫曼是二进制编码的,而本题为k进制编码,因此也叫作k叉二叉树。既然想到这里,那类似二进制哈夫曼树的构造,我们先构造一个优先队列,(优先队列是个好东西,因为他可以自动排队啊,这里我们按小根堆,也就是队列中的元素从小到大排序),我们把前k个最小的数弹出来,组成一组,再把他们的和加入优先队列。现在就有一个问题,就是,你叶子那些层都填好了,填的满满的,但是,你最后一层,也就是根节点的下一层还有空,那这可就很浪费资源了,因为根节点的下一层的编码长度为1,你要是把一个叶子结点放了这个地方,那最后的编码长度一定更小啊。

所以这里就有一个很巧妙的方法,就是用0来顶,一直往优先队列里加0,直到根节点的下一层都填满。我们可以知道,一棵完整的哈夫曼树,只要不是叶子结点,每个节点都有k个孩子,那这棵哈夫曼树所有叶子结点总共有多少个呢?

以上图为例,此时k取3,要是2没有分支,那该树有3个叶子节点,但是,一旦有了分支,就会发现,多了两个,成了5个叶子结点了,所以,要想满哈夫曼树,那他的叶子结点个数一定为x*(k-1)+1。又因为我们已知有n个叶子结点,所以我们也就通过判断(n-1)%(k-1)来判断是不是满哈夫曼树,不满的话,用0去往上顶空,那需要顶多少个空呢,可以推算的要顶(k-1)-(n-1)%(k-1)个空。(很简单嘛,他不是不整除嘛,就是余数小于k-1,那把余数加到k-1不就行了嘛)。

好了,现在第一问结束,在一个问题是,那个层次,怎么算是最大。其实从队列里出来k个数相加后,算出来的那个数,就相当于在这k个数的基础上往上跳了一层,当然,这k个数层数可能不一样,那最后的和一定是最大那一层加一啊,所以我们只要求出最大一层再加一就行。

现在就上代码了

#include<bits/stdc++.h>
using namespace std;
struct node{long long w,h;node(){w=0;h=0;}node(long long w,long long h):w(w),h(h){}bool operator < (const node &a) const{return a.w==w?h>a.h:w>a.w;}//优先队列默认大根堆,既堆顶元素最大,//默认的bool operator() (const T& x, const T& y) const {return x<y;} //要改成栈顶元素最小,需要重载比较内部函数<
};
priority_queue<node>q;
long long n,k,ans,sum=0,s1,a,layer=0,h;
int main(){scanf("%lld%lld",&n,&k);for(int i=1;i<=n;i++){scanf("%lld",&a);q.push(node(a,1));sum+=a;}if(n<=k) {ans=sum;layer=1;}else{if((n-1)%(k-1)!=0){for(int i=1;i<=((k-1)-(n-1)%(k-1));i++)q.push(node(0,1));//非常重要,就是k叉二叉树最后一层可能不满,用0来代替 }while(q.size()>=k){s1=0;h=-1;for(int i=1;i<=k;i++){node x=q.top();q.pop();s1+=x.w;h=max(h,x.h);}q.push(node(s1,h+1));ans+=s1;} }printf("%lld\n%lld",ans,q.top().h-1);
}

洛谷P2168荷马史诗(小根堆)相关推荐

  1. 洛谷P2168 荷马史诗 [NOI2015]

    题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...

  2. 洛谷 P2168 荷马史诗(抄)

    题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...

  3. 洛谷P2168 荷马史诗

    哈夫曼树原理. k=2时,和合并果子一样一样的. 由此思考,k>2时,应该也有相似的原理.确实如此,k进制哈夫曼树,每个结点最多会有k-1个子结点,对应k-1个元素("元素" ...

  4. 【洛谷P2168】荷马史诗

    题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...

  5. NOI2015 Day2 T1 荷马史诗(洛谷P2168)

    题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...

  6. [Huffman树] aw149. 荷马史诗(哈夫曼模型+贪心)

    文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:149. 荷马史诗 2. 题目解析 k叉哈夫曼树问题. n 个叶子节点合并成 1 个点,总共合并减少 n-1 个点,每次合并都会减少 ( ...

  7. ajax荷马史诗,荷马史诗(8)

    <奥德赛>(Odyssey) 奥德修斯的希腊文原意是"麻烦":他既带给别人麻烦,自己也遭遇麻烦 <埃阿斯和卡珊德拉>(Ajax and Cassandra) ...

  8. 算法进阶指南:0x17:荷马史诗

    原题链接 追逐影子的人,自己就是影子. --荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和 ...

  9. [NOI 2015]荷马史诗

    Description 追逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...

最新文章

  1. Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...
  2. 收藏 | 常见的神经网络求导总结!
  3. Cesium调用 WMS 、WMTS 服务
  4. Python3 list 自定义比较函数
  5. atcoder题目合集(持续更新中)
  6. Map .NET Concepts to the Lightning Platform——list,set,map
  7. 【深度学习】我的第一个基于TensorFlow的卷积神经网络
  8. 转发: Visual Studio 2005常用插件
  9. u-boot分析(四)---设置异常向量表|设置SVC模式
  10. centos配置ntp时间同步_Linux CentOS配置ntpd时间同步
  11. 医生c语言测试卷b卷的答案,合肥工业大学C语言期中测试题_B卷
  12. 【英语学习】【Level 08】U05 Better option L2 Online shopping
  13. EFK+sentinl报警机制
  14. 1.7 Linux文件目录查看与编写内容
  15. python怎么接管浏览器_用python操作浏览器的三种方式
  16. c语言入门很难,C语言入门教程,C语言编程,从入门到精通,没你想的那么难
  17. 生成各种格式的 Excel 文件示例
  18. 软件项目管理中的需求管理要以用户为中心
  19. 前端页面如何获取高德地图
  20. 2022哈工大计算机系统大作业——程序人生

热门文章

  1. STM32用CH340烧录程序
  2. Java——黑马程序员双色球案例
  3. 利用 Python 一键下载网易云音乐 10W+ 乐库
  4. 尚筹网 —— 4、[知识] RBAC 权限控制模型 和 Ajax请求
  5. 富贵包可不富贵,一个原则尽早消除
  6. linux文本去重分割,Linux命令去重统计排序
  7. 西电计网ARP欺骗实验
  8. MATLAB使用基础(第三节)
  9. 【复习笔记】线性代数——线性方程组
  10. kaggle注册问题