当前位置: 首页 > news >正文

洛谷P2168 荷马史诗 堆 哈夫曼树


洛谷P2168 荷马史诗
堆     数学 
题意 实际上就是让你构造 一棵 K叉哈夫曼树

哈夫曼树其实就是路径权值和最小的树
路径权值权值和 = sigama 用的次数 * 深度

为了让路径权和最小
那么我们肯定是要让 用的次数越多的数深度越小


关于二叉哈夫曼树 我们是怎么构造的呢,
我们使用合并果子 一样构造的,每一次选择 最小的两个数 a b
然后将 a+b 加入序列中
然后K叉也差不多是这样
每次你可以选择 K 个数 然后 a1 a2 a3 a4 ...ak 然后将他们的和加入序列之中
但是有些时候你可能不到 k 个
因为 一次 合并越多肯定越优 ,因为你合并越多,等于说你重复用的数就越少了
因为最后一次合并时造成的 和最大 ,所以你要保证 最后一次 一定是 K个合并的
为了保证 一定是 K 个合并 你就可以 事先插入 若干个 0 确保 (n-1) % (k-1) == 0
然后这样就能确保 k 个k个合并一定能够完全合并了
然后就可以像合并果子 一样,每次选择前 k 小的,然后合并
然后我们用堆来维护 前 k 小的数
然后为了让深度最小,
为了让深度最小,我们在合并若干个 分数相同的 果子时 ,我们优先合并深度 较小的 ,尽量使深度不增加
然后我们堆就开两个关键字 第一关键字 按照 值从小到大排序 ,第二关键字 按照深度从小到大排序

 

 1 #include <bits/stdc++.h> 
 2 #define ll long long 
 3 using namespace std ; 
 4 
 5 const ll N = 100011 ; 
 6 struct node{
 7     ll val,deep ; 
 8 };
 9 struct cmp{
10     bool operator() (node a,node b) 
11     {
12         if(a.val!=b.val) return a.val > b.val ; 
13         return a.deep > b.deep ; 
14     }
15 };
16 /*
17 
18 我们堆就开两个关键字  第一关键字 按照 值从小到大排序  ,第二关键字 按照深度从小到大排序  
19 
20 */ 
21 priority_queue <node,vector<node>,cmp > Q ; 
22 node p ; 
23 ll n,k,w,sum,mx,ans ; 
24 
25 inline ll read() 
26 { 
27     ll x = 0 , f = 1 ; 
28     char ch = getchar() ; 
29     while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ; } 
30     while(ch>='0'&&ch<='9') { x = x * 10+ch-48 ; ch = getchar() ; } 
31     return x * f ;   
32 }
33 
34 int main() 
35 {
36     n = read() ;  w = n ;  k = read() ; 
37     while((n-1) % (k-1)!=0 ) 
38     {
39         p.deep = 0 ; p.val = 0 ; 
40         Q.push( p ) ; 
41         n++ ; 
42     }  
43     n = w ; 
44     for(ll i=1;i<=n;i++) 
45     {
46         p.deep = 0 ; p.val = read() ; 
47         Q.push( p ) ; 
48     }
49     
50     while(Q.size()>1) 
51     {
52         sum = 0 ; mx = 0 ; 
53         for(ll i=1;i<=k;i++) 
54         {
55             sum+=Q.top().val ; 
56             if( Q.top().deep > mx ) mx = Q.top().deep ; 
57             Q.pop() ; 
58         }
59         p.val = sum ; p.deep = mx + 1 ; ans+=sum ; 
60         Q.push( p ) ; 
61     }
62     printf("%lld\n%lld\n",ans,Q.top().deep) ; 
63     return 0 ; 
64 }

 

转载于:https://www.cnblogs.com/third2333/p/7132842.html

相关文章:

  • 去哪网实习总结:开发定时任务(JavaWeb)
  • 【软件周刊第 36 期】Linux Kernel 4.12 正式发布;Fedora 26 下周二到来
  • go学习--控制语句
  • selenium打开chrome时,出现 您使用的是不受支持的命令行标记:--ignore-certificate-errors...
  • 揭开PaaS的神秘面纱 关注PaaS的实际业务价值
  • Django 数据库ORM 操作 - 字段的类型和参数
  • 2016年8月印度电信市场表现
  • GDI+学习之------ 画线、区域填充、写字
  • 参加51CTO学院软考培训,我通过啦
  • 资金流学习-逐笔交易的分析
  • C语言基础知识【作用域规则】
  • C语言基础知识【指针】
  • Apache无法启动报错
  • noip2014 普及组
  • 利用SEH防范BP(int 3)断点
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android系统模拟器绘制实现概述
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • C++类中的特殊成员函数
  • CSS3 变换
  • export和import的用法总结
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JavaScript函数式编程(一)
  • jquery cookie
  • mysql常用命令汇总
  • nodejs调试方法
  • Python学习之路13-记分
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Theano - 导数
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 分类模型——Logistics Regression
  • 猴子数据域名防封接口降低小说被封的风险
  • 简析gRPC client 连接管理
  • 前端技术周刊 2019-02-11 Serverless
  • 深入浅出Node.js
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #Z0458. 树的中心2
  • (20050108)又读《平凡的世界》
  • (HAL库版)freeRTOS移植STMF103
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三)终结任务
  • (十) 初识 Docker file
  • (四)linux文件内容查看
  • (一)kafka实战——kafka源码编译启动
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转载)Google Chrome调试JS
  • (转载)深入super,看Python如何解决钻石继承难题