修理牧场( 哈夫曼算法 ,贪心 )
描述:
农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li 的总和。
但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。
请编写程序帮助农夫计算将木头锯成N块的最少花费。
问题分析:
由于一次锯木头产生花费的同时还产生2块木头,因此可以尝试用二叉树表示锯木头的过程,树的根节点是初始的木头,叶节点是最终需要的木块。在树中非叶节点的权重等于其子节点的权重和,这样的树有很多种,每棵树所对应的锯木方法所产生的花费就是所有叶节点权重与其到根节点路径长度乘积的和
也就是求最小的带权路径长度(所有叶结点带权路径长度之和),也就是哈夫曼树问题;我们可以逆向思考这个问题,即已经有N个锯开的木块,如何合并才能使合并的花费最少,可以使用哈夫曼算法;
给出一个我找到的很好的讲哈夫曼算法的博客,分享~
哈夫曼算法
哈夫曼树的构建可以通过优先队列的小根堆实现,每次合并所有节点里权值最小的两个,在哈夫曼树中就是每次合并根节点最小的两颗树,把新树加入合并的队伍中,把原来两棵树删除;
#include<bits/stdc++.h>
using namespace std;typedef unsigned long long ull;
typedef long long ll;const ll maxx = 1e18;
const int N = 1e6+100;
const int p = 1e4;
const double eps = 1e-8;priority_queue<int,vector<int>,greater<int> >pmin;
int n,t,sum;int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>t;pmin.push(t);}while(pmin.size()!=1){int k1,k2;k1=pmin.top();pmin.pop();k2=pmin.top();pmin.pop();sum+=(k1+k2);pmin.push(k1+k2);}cout<<sum;
}
反思:
之前的贪心题里做过一个合并果子的一个题,现在想想那个题也是求树的最小带权路径长度的问题,也要用哈夫曼算法来做。
修理牧场( 哈夫曼算法 ,贪心 )相关推荐
- 修理牧场(哈夫曼树 )
农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li的总和. 但是农夫自己没有锯子,请 ...
- PTA:修理牧场(哈夫曼算法)
农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li的总和.但是农夫自己没有锯子,请人锯木的酬 ...
- 哈夫曼算法证明+哈夫曼编码译码程序实现
哈夫曼算法证明 哈夫曼算法是一种贪心算法,我们考虑证明其最优子结构和贪心选择性质: 最优子结构:假设一个树是哈夫曼树,则以其任意节点为根节点的最大子树也是哈夫曼树. 证明:子树的根节点的值是其所有叶子 ...
- 使用libjpeg进行图片压缩(哈夫曼算法,无损压缩)
Huffman算法也是一种无损压缩算法,但与LZW压缩算法不同,Huffman需要得到每种字符出现概率的先验知识.通过计算字符序列中每种字符出现的频率,为每种字符进行唯一的编码设计,使得频率高的字符占 ...
- 利用C++实现哈夫曼算法
我想每个计算机专业的学生或多或少都接触过哈夫曼编码,数据结构中的老问题了.大体就是给出一些字符,和这些字符的出现频率,让你为这些字符设计一个二进制编码,要求频率最高的字符的编码最短.解决的方法是构造一 ...
- 哈夫曼算法(huffman algorithm C)
哈夫曼算法:树的权值*路径相加最小. #include<stdio.h> #define size 10 typedef struct huffman {int weight;int lc ...
- 霍夫曼算法_霍夫曼编码算法
霍夫曼算法 In this tutorial, we'll be discussing and implementing the Huffman Coding Algorithm in Java. 在 ...
- 基于哈夫曼算法的文件压缩软件
数据结构课设(一) 作业要求 1.设计并实现一个使用哈夫曼算法对文件进行压缩的工具软件. 2.通过命令行参数指定操作模式(压缩/解压).源文件名.目标文件名. 3.压缩操作将源文件按字节读入并统计字节 ...
- 哈夫曼算法编码26字母程序实现C++
一.编程目的 (1)学习和理解树和二叉树的概念.特点和相关知识,理解和掌握二叉树的遍历操作的原理和方法:掌握二叉树的常用存储结构以及C++类的实现方法. (2)学习最优二叉树的概念,理解和掌握哈夫曼算 ...
最新文章
- C运算符的优先级和结合律 图片类型展示!
- myeclipse 引用jar包中代码,做断点
- mochiweb 源码阅读(八)
- asp创建mysql表_asp创建数据库表
- DataSet存储数据和结构到XML
- 在哪里搜python题_robots文件生成
- 二次函数计算机课件,《二次函数的应用》课件
- STM32单片机基础知识总结(一)
- 紫猫插件-网络共享数据(1-6)
- excel如何批量查询ip归属地?
- 57-20210402华为海思Hi3516DV300的linux系统下NFS文件系统挂载(eMMC模式)
- linux实用教程复习题,linux上机复习题(部分答案)
- 【微信小程序】echarts 正态分布图 区间柱形图
- 基于单片机的纸牌24点游戏模拟器设计
- 前端一班:HTML5当天学习总结-摘抄张果博客园
- 李彦宏妻子马东敏向中科大捐赠一亿,成立“蔷薇科大发展基金”
- MangoDB插入、删除和查询文档
- 产业合作打造中国云计算实践通途
- 计算机硬盘ssd,如何查看电脑硬盘接口_如何查看电脑固态硬盘接口-win7之家
- 数世咨询:EDR能力指南