来源:https://www.luogu.com.cn/problem/UVA12676

题目大意:已知huffman编码长度,反过来估计各叶子结点的最小权重和。

这里面的隐含条件就是:
1)求各叶子节点的权重和 = 求huffman树根节点的权重
2)
(重点)上层叶子节点一定至少是下层各节点权重的最大值!(这也解决了如何让叶子节点的权重和最小问题)

最重要的解题思路是:

从上而下推理,假设最深层权重假设全为1(保证得到最小权重),下层节点合并,得到上层新生成的中间节点,而原有的上层的叶子节点等于是下层各节点权重的最大值,再继续合并,直到合并为最终的根节点。

输入:
输入文件包含多个测试用例,每个测试用例如下所述:
第一行包含一个整数 N(2≤N≤50),表示文本中出现的不同字符数。
第二行包含 N 个整数 Li(1≤Li≤50,i=1,2,…,N),表示由 huffman 算法生成的不同字符 的编码长度。
假设至少存在一棵上述算法构建的树,可以生成具有给定长度的编码。
输出:
对每个测试用例,输出一行,表示所有字符总数的最小值。
举例:
 
输入:
4
3 1 2 3
输出:
5

#include <bits/stdc++.h>
using namespace std;
vector<int> deep[100]; //已知条件是知道编码长度,则就是知道了该节点的深度,同一深度可能有多次合并。
int main(){int n;cin>>n;int maxDeep=0; for(int i=0;i<n;i++){int m;cin>>m; //编码长度 等于 节点深度 deep[m].push_back(0);//用0占位 //跟新并记录最大层数 if(m>maxDeep){maxDeep=m;} }//假设叶子节点的权重(初值为1,因为最深层权重最小为1)int temp=1;//深度为m,则需要m-1次合并,自下而上 for(int i=maxDeep;i>0;i--){for(int j=0;j<deep[i].size();j++){if(deep[i][j]==0){//如果等于0 就代表是叶子节点 deep[i][j]=temp;//将叶子节点假设为上一层节点的最大权重 }                 }sort(deep[i].begin(),deep[i].end());//第i层从小到大排序,原因:获得该层节点的最大的权值 //合并for(int j=0;j<deep[i].size();j=j+2){deep[i-1].push_back(deep[i][j]+deep[i][j+1]);//新生成的双亲节点(反向生成中间节点) temp=deep[i][deep[i].size()-1];//保存该层节点的最大权值 }}cout<<*deep[0].begin()<<endl;return 0;
}

注意:权值可能很大,数组可定义为long long类型

洛谷-UVA12676 Inverting Huffman(反转树)相关推荐

  1. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  2. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  3. 洛谷——P1047 校门外的树 python实现

    洛谷--P1047 校门外的树 python实现 l, m = map(int, input().split(' ')) trees = [True]*(l+1) for i in range(m): ...

  4. 洛谷试炼场 P1553 数字反转(升级版)题解

    洛谷试炼场 P1553 数字反转(升级版)题解 [c] 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数. ...

  5. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  6. 洛谷(P3373)线段树加乘混合模板

    题目链接:P3373 [模板]线段树 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题目的意思很明确,就是要我们在线完成区间的乘和加运算并支持查询区间和的一个问题.处理这道 ...

  7. 洛谷题解——P1873:砍树

    视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1jk4y1k7hq/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...

  8. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  9. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  10. 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)

    传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树 ...

最新文章

  1. python自学时间-python基础学习时间time和datetime模块
  2. 员工张三有两个主管线程_如何做好中层?想让领导满意、员工信服、自己轻松,这2技能必备...
  3. 报名 | “智见AI”SpringCamp:物体检测与深度神经网络模型设计
  4. scikit-learn学习笔记(四)Ridge Regression ( 岭回归 )
  5. Obtain a Permutation(思维)
  6. 阿里云欧洲数据中心开放运营:与沃达丰达成战略合作
  7. 计算机大作业论文意义,大学的大作业是什么?
  8. Javascript 模块化指北
  9. php阿拉伯语字符串,按字母顺序命名阿拉伯语名称Mysql和php
  10. JQuery 绑定事件
  11. linux进程泄漏如何定位,定位Linux下定位进程被谁KILL
  12. 关于eclipse编译出错,缺失tools.jar 1.8
  13. 萤火虫算法求解简单TSP问题
  14. 用pod安装swiftyJson的一个实例
  15. sap 新增科目表_在SAP中新建会计科目
  16. 面试官问你“有什么问题问我吗?”,你该如何回答? 1
  17. 命令行下获取公网IP地址汇总
  18. 计算机一级照片提取,iCloud里面的照片怎么在电脑上提取
  19. 闲鱼怎么引流到淘宝客?吸引住大量的粉丝
  20. Fiddler简介与Web抓包,远程抓包——小白入门

热门文章

  1. PadOS迅雷testflight下载教程
  2. 最新服务器处理器天梯,服务器cpu天梯图2020
  3. ssh: connect to host github.com port 22: Connection refused
  4. xml配置service服务器文件路径,xml配置service服务器文件路径
  5. 小白如何打造一个基础的留言板网站(一)
  6. ubuntu20.04.1下安装qt4相关依赖库
  7. php校园一卡通系统
  8. 《Spring Recipes》第三章笔记3:Specifying Aspect Preced...
  9. 如何用计算机画地形地貌图,基本地形图计算软件(图号计算器)V2.1 最新版
  10. abp框架java_ABP框架的体系结构及模块系统讲解