题目描述

xiaok大佬最近再雇佣工人给他掰木棒。把一根长为L的木棒锯成两段,他需要支付给工人L元钱。xiaok大佬一开始只有长为L的一根木棒,他想把它锯成n段,每段长度分别为L1,L2,…,Ln,问xiaok大佬最少要付给工人多少钱?
输入
第一行两个整数n,L(1<n<103,n<L<109)
第二行n个整数L1,L2,…,Ln(0<Li<L,且保证L1+L2+…+Ln=L)
输出
输出一个整数,表示最小花费
样例输入
3 21
8 5 8
样例输出
34
思路:首先考虑到的是明显可以使用贪心算法,即:每次折掉n段中最大的那一段,就可以使得下一次折棒的花费尽可能的小。编写的代码如下:

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{int n, L;cin >> n >> L;int MinCost = 0;int* Ln = new int[n];for (int i = 0; i < n; i++)cin >> Ln[i];sort(Ln, Ln + n);for(int i=n-1;i>0;--i){MinCost += L;L = L - Ln[i];}cout << MinCost;
}

然而提交到OJ后只有25%的AC,也就是说想法应该是基本错了。问题出在哪儿呢?老师指出这题应该是哈夫曼树,我对比了一下自己的贪心和哈夫曼树的区别,发现我所想的贪心存在缺陷,每次是一定要选出最终结果中的一段中的最大值的,其实折出这个n段中的最大值并不能使下一次的折棒耗费最小,比如
4 29
4 8 9 8
如果第一次折出20 9,那么下一次的耗费将是20,折出12 8;再下一次耗费12,折出8 4;我们可以看到耗费分别是29 20 12;
如果使用哈夫曼树的构建方式,则是29 17 12。
区别就在于,折棒会产生两段,两端都是可以再折的,而我所设想的贪心算法直接放弃了其中一段的折。最大的一段不一定非得要最先折掉,下一步的耗费才最小。哈夫曼算法自底向上,能够确保遍历出综合考虑每次最小的折棒代价。
以下是正确ac的代码:

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{int n, L;cin >> n >> L;int MinCost = 0;int* Ln = new int[n];priority_queue<int, vector<int>, greater<int>> pq;for (int i = 0; i < n; i++){cin >> Ln[i];pq.push(Ln[i]);}while (pq.size() > 1){int temp1 = pq.top();pq.pop();int temp2 = pq.top();pq.pop();int tempsum = temp1 + temp2;pq.push(tempsum);MinCost += tempsum;}cout << MinCost;delete []Ln;
}

(个人反思:其实我之前太贪玩,直到这次作业都没有真正学在编程中使用数据结构的知识,比如这次所使用的优先队列,还有容器的概念。这次是第一次使用,要开始抓紧学习了。)

算法导论作业 问题 A: algorithm-锯木棒相关推荐

  1. 中国矿业大学算法概论作业一A、锯木棒

    A.algorithm-锯木棒 题目描述 xiaok大佬最近再雇佣工人给他掰木棒.把一根长为L的木棒锯成两段,他需要支付给工人L元钱.xiaok大佬一开始只有长为L的一根木棒,他想把它锯成n段,每段长 ...

  2. 中国矿业大学算法导论作业

    中国矿业大学算法导论作业 文章目录 中国矿业大学算法导论作业 作业一 A: algorithm-锯木棒 B: algorithm-最长公共子序列 C: algorithm-矩阵连乘 D: algori ...

  3. 算法导论作业——沙子的质量

    问题 D: algorithm-沙子的质量 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N< =300).每堆沙子有 ...

  4. 算法导论OJ-锯木棒

    算法导论OJ-锯木棒 一.原题目 1.题目描述 2.输入 3.输出 4.样例输入 5.样例输出 二.题目分析 三.代码 一.原题目 1.题目描述 xiaok大佬最近再雇佣工人给他掰木棒.把一根长为L的 ...

  5. 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录

    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...

  6. 算法导论Java实现-构建MaxHeap

    package lhz.algorithm.chapter.six; /** * "构建堆",<算法导论>6.3章节 Building a heap * 利用之前实现的 ...

  7. 算法导论Java实现-随机化数组的两种方式(5.3章节)

    package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...

  8. Java实现算法导论中快速傅里叶变换FFT递归算法

    要结合算法导论理解,参考:http://blog.csdn.net/fjssharpsword/article/details/53281889 代码中算法思路:输入n位(2的幂)向量,分别求值FFT ...

  9. Java实现算法导论中线性规划单纯形算法

    需在理解算法导论中线性规划单纯性算法基础上理解Java实现的代码,结合http://blog.csdn.net/fjssharpsword/article/details/53195556理解. 具体 ...

最新文章

  1. 【跃迁之路】【552天】程序员高效学习方法论探索系列(实验阶段309-2018.08.11)...
  2. 拋棄虛擬機,微軟實驗讓我們在線做(一)
  3. app 应用商店系统php,GitHub - ChhXin/appstore-admin: 基于ThinkPHP的应用商店后台管理系统...
  4. 获取sessionid_蓝牙音乐AudioTrack Session ID的获取
  5. lia人是什么意思_老话说“人穷别说话,位卑莫劝人”,什么意思?有何道理?...
  6. 北京豪宅市场调查:多项目集中放量使选择面加大
  7. python 经典函数
  8. 用python进行wifi密码生成
  9. 谷歌设置支持webgl
  10. quartz 的job中获取到applicationContext
  11. C#中制作启动窗体的方法和问题
  12. java中怎么画弧线加粗,CAD中怎么把一段线、曲线或圆弧加粗
  13. 翻转课堂融入计算机课,【计算机基础论文】大学计算机基础翻转课堂的构建思路(共3745字)...
  14. 国内知名MCU厂商官网整理
  15. PAT天梯赛Level2题目题解汇总
  16. AIoT在智慧景区中的应用
  17. fever pitch 狂热, 极度兴奋
  18. 易语言 获取活动网卡的连接速度(速率)
  19. Drupal菜鸟笔记之使用Paragraphs建站
  20. 【备忘】2016年【极限班培训】大数据(尚学堂)

热门文章

  1. loading数据加载的6种形式
  2. 数据分析-------统计学-------假设检验和p值、单侧检验、双侧检验、z统计量、t统计量、第一类错误、第二类错误
  3. 什么是 Embedding()
  4. 【CF #792 Div1+Div2】A-E
  5. H264-AAC 格式解析
  6. async/await原来这就是语法糖
  7. 墨菲定律 二八法则 马太效应 手表定理 不值得 定律 彼得原理 零和游戏 华盛顿合作规律 酒与污水定律 水桶定律 蘑菇
  8. 2022年全国职业院校技能大赛试题9(中职组)
  9. one + two = 3 C语言
  10. 如何安装centos详细步骤