农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是L​i的总和。但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。

请编写程序帮助农夫计算将木头锯成N块的最少花费。

输入格式:
输入首先给出正整数N(≤10​^4 ),表示要将木头锯成N块。第二行给出N个正整数(≤50),表示每段木块的长度。

输出格式:
输出一个整数,即将木头锯成N块的最少花费。

输入样例:
8
4 5 1 2 1 3 1 1

输出样例:
49

这道题其实是运用哈夫曼算法,把每一小段木头看作一个点,比如长度为4的一下段木头,那么这个权值就是4。
具体每次找到两个权值最小的点相加得到新点……最终之和权值最小。如本题长度为20要锯成8,7,5;根据哈夫曼算法首先5<7<8, 5+7=12, 12+8=20, 即最优解。

#include <iostream>
#include <vector>
#include <queue>using namespace std;int main()
{priority_queue<int, vector<int>, greater<int> > a;int n, temp;cin >> n;int i;for (i = 0; i < n; i++){cin >> temp;a.push(temp);}int sum = 0;while (!a.empty()){int x = a.top();  //取队列头元素,这与栈不同,栈(stack)是取栈顶元素a.pop();   //弹出队列头元素if (a.empty())breaint y = a.top();a.pop();x += y;sum += x;a.push(x);}cout << sum;return 0;
}

PTA:修理牧场(哈夫曼算法)相关推荐

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

    描述: 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li 的总和. 但是农夫自己没有锯子,请人 ...

  2. 修理牧场(哈夫曼树 )

    农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i​​个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是L​i​​的总和. 但是农夫自己没有锯子,请 ...

  3. 使用libjpeg进行图片压缩(哈夫曼算法,无损压缩)

    Huffman算法也是一种无损压缩算法,但与LZW压缩算法不同,Huffman需要得到每种字符出现概率的先验知识.通过计算字符序列中每种字符出现的频率,为每种字符进行唯一的编码设计,使得频率高的字符占 ...

  4. 哈夫曼算法证明+哈夫曼编码译码程序实现

    哈夫曼算法证明 哈夫曼算法是一种贪心算法,我们考虑证明其最优子结构和贪心选择性质: 最优子结构:假设一个树是哈夫曼树,则以其任意节点为根节点的最大子树也是哈夫曼树. 证明:子树的根节点的值是其所有叶子 ...

  5. 利用C++实现哈夫曼算法

    我想每个计算机专业的学生或多或少都接触过哈夫曼编码,数据结构中的老问题了.大体就是给出一些字符,和这些字符的出现频率,让你为这些字符设计一个二进制编码,要求频率最高的字符的编码最短.解决的方法是构造一 ...

  6. 哈夫曼算法(huffman algorithm C)

    哈夫曼算法:树的权值*路径相加最小. #include<stdio.h> #define size 10 typedef struct huffman {int weight;int lc ...

  7. 霍夫曼算法_霍夫曼编码算法

    霍夫曼算法 In this tutorial, we'll be discussing and implementing the Huffman Coding Algorithm in Java. 在 ...

  8. 基于哈夫曼算法的文件压缩软件

    数据结构课设(一) 作业要求 1.设计并实现一个使用哈夫曼算法对文件进行压缩的工具软件. 2.通过命令行参数指定操作模式(压缩/解压).源文件名.目标文件名. 3.压缩操作将源文件按字节读入并统计字节 ...

  9. 哈夫曼算法编码26字母程序实现C++

    一.编程目的 (1)学习和理解树和二叉树的概念.特点和相关知识,理解和掌握二叉树的遍历操作的原理和方法:掌握二叉树的常用存储结构以及C++类的实现方法. (2)学习最优二叉树的概念,理解和掌握哈夫曼算 ...

最新文章

  1. PL/SQL 基础( 上 )
  2. Python初识与简介【开篇】
  3. vue学习笔记之:为何data是一个方法
  4. 从浏览器中下载文件如何修改默认保存位置
  5. 360回归A股,周鸿祎来给BAT和小米添堵了
  6. php 大型网站内链,网站SEO关键词优化如何做好站内链接即网站内链?
  7. cocos2d-x帧动画实现(续)
  8. mysql 5.7 slow_mysql 5.7 解决 set global slow_query_log=on;报错
  9. python3的文件编码问题
  10. css+js调整当前界面背景音量
  11. html语言标记说明,HTML中注释标签的使用方法
  12. 淘宝店铺装修旺铺基础版全屏轮播代码效果1920PX海报
  13. 艺龙深耕酒店VS携程 布局旅游全产业
  14. ubuntu 下,用户,文件夹,用户组 之理解
  15. RDS数据库空间满了怎么办?
  16. 在路上●我的年轻●勇往直前●匆匆十年
  17. web程序发布后发送传真失败记要
  18. java开源cad_CAD设计你需要以下几款开源工具
  19. 【入门篇】一、什么是单片机
  20. css hack方法,CSS Hack的基本原理和实现方式

热门文章

  1. 刮刮奖效果的简单实现
  2. Android PC同步软件 类似 apple 的 itunes
  3. TeamView: 为了进一步增强安全性,在发起连接之前,我们希望您先验证您的账户
  4. 解决office,word奔溃的问题
  5. cad线性标注样式修改在哪里_自定义设置CAD标注样式教程
  6. Rocky——CentOS的延续(原版开发人员)安装与安装后必要操作(个人版)
  7. matplotlib总结
  8. 当我们讨论“平台”,我们在说什么
  9. 干货 | 万字详解整个数据仓库设计体系
  10. 100万算大钱还是小钱?