博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOI2015]荷马史诗
阅读量:5046 次
发布时间:2019-06-12

本文共 1090 字,大约阅读时间需要 3 分钟。

题目:洛谷P2168、codevs5501。

题目大意:

有n种单词,每种单词有一个出现次数。现在要用k进制字符串代表这些单词,使得任意一个字符串不是另一个的前缀。问:最短的总长度是多少?最短的单词长度是多少?
解题思路:
哈夫曼编码构造过程,k进制就每次取k个合并。
用优先队列实现即可。
注意:最后合并时可能出现不够,所以可以一开始增加一些空节点占位。

C++ Code:

#include
#include
#define LoveLive long longusing namespace std;__gnu_pbds::priority_queue
,greater
>,__gnu_pbds::pairing_heap_tag>h;int n,k;inline LoveLive readint(){ int c=getchar(); LoveLive d=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar())d=(d<<3)+(d<<1)+(c^'0'); return d;}int main(){ n=readint(),k=readint(); for(int i=1;i<=n;++i)h.push(make_pair(readint(),1)); if((n-1)%(k-1)) for(int i=k-1-(n-1)%(k-1);i;--i)h.push(make_pair(0ll,1)); LoveLive niconiconi=0; for(int tot=n+(((n-1)%(k-1))?k-1-(n-1)%(k-1):0);tot>1;tot-=k-1){ int mx=0; LoveLive sm=0; for(int i=1;i<=k;++i){ pair
p=h.top(); h.pop(); mx=max(mx,p.second); sm+=p.first; } niconiconi+=sm; h.push(make_pair(sm,mx+1)); } printf("%lld\n%d\n",niconiconi,h.top().second-1);}

 

转载于:https://www.cnblogs.com/Mrsrz/p/9157256.html

你可能感兴趣的文章
iOS开发(Objective-C)常用库索引
查看>>
[源码和文档分享]基于C#和SQL SERVER的校园知识问答论坛网站的设计与实现
查看>>
面向对象基础项目----图书管理系统(数组)
查看>>
BZOJ 3731 3731: Gty的超级妹子树 [树上size分块 !]
查看>>
BZOJ 2049: [Sdoi2008]Cave 洞穴勘测 [LCT]
查看>>
ubuntu15.10安装搜狗拼音输入法
查看>>
低调发布一个百度谷歌关键字搜索工具
查看>>
js函数的节流与防抖
查看>>
Web系列:网页版超级计算器,仿百度搜索框,仿百度视频选项卡
查看>>
Redis的架构以及有关事务使用场景
查看>>
LeetCode Reverse Words in a String II
查看>>
安卓开发之调用摄像头、相册
查看>>
IT职场人生系列之十四:经验积累
查看>>
01011_怎么打开任务管理器?win7打开任务管理器方法
查看>>
用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件
查看>>
服务器端异步接受SOKCET请求
查看>>
联玛客(T 面试)
查看>>
JQ实现弹幕效果
查看>>
0909上机作业
查看>>
MAC 系统 各种操作
查看>>