修理牧场( 哈夫曼算法 ,贪心 )

简介: 修理牧场( 哈夫曼算法 ,贪心 )

描述:


农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要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;
} 


反思:


之前的贪心题里做过一个合并果子的一个题,现在想想那个题也是求树的最小带权路径长度的问题,也要用哈夫曼算法来做。


目录
相关文章
|
24天前
|
存储 人工智能 算法
哈夫曼算法详细讲解(算法+源码)
哈夫曼算法详细讲解(算法+源码)
|
11月前
|
存储 算法 Windows
用二叉树实现哈夫曼算法、哈夫曼树提升压缩比率及可逆压缩和非可逆压缩
用二叉树实现哈夫曼算法、哈夫曼树提升压缩比率及可逆压缩和非可逆压缩
49 0
|
11月前
|
存储 算法
RLE算法机制、缺点及哈夫曼算法和莫尔斯编码
RLE算法机制、缺点及哈夫曼算法和莫尔斯编码
102 0
|
存储 算法
【数据结构和算法】哈夫曼树及其应用
【数据结构和算法】哈夫曼树及其应用
315 0
【数据结构和算法】哈夫曼树及其应用
|
算法 Java 关系型数据库
算法之树(二,B+树、哈夫曼树、堆、红黑树)(Java版)-持续更新补充
B+树的优势 1.单一节点存储更多元素。B+树中间节点没有卫星数据(也就是说只包含索引信息),所以每个非叶子节点可以包含更多的内容,同样大小的磁盘页可以容纳更多的节点元素。也就是说B+树会在相同数据量的情况下比B树更加“矮胖”,查询的IO次数更少。
6029 0
|
算法 C++ 容器
STL实现哈夫曼算法
用C++ std::priority_queue 实现哈夫曼算法我想每个计算机专业的学生或多或少都接触过哈夫曼编码,数据结构中的老问题了。大体就是给出一些字符,和这些字符的出现频率,让你为这些字符设计一个二进制编码,要求频率最高的字符的编码最短。
1437 0
|
算法
一步一步写算法(之哈夫曼树 上)
原文: 一步一步写算法(之哈夫曼树 上) 【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】       在数据传输的过程当中,我们总是希望用尽可能少的带宽传输更多的数据,哈夫曼就是其中的一种较少带宽传输的方法。
731 0
|
算法 测试技术 搜索推荐
一步一步写算法(之哈夫曼树 下)
原文: 一步一步写算法(之哈夫曼树 下) 【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     前面说到了哈夫曼树的创建,那下面一个重要的环节就是哈夫曼树的排序问题。
911 0
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真