一、问题引入

农夫约翰为了修理栅栏,要将一块很长的木块切成N块。准备切成的长度分别是L1、L2、、、,LN,未切割前的木板长度切好为切割后木板长度的总和。每次切断木板时的开销是这块木板的长度。(1 ≤ N ≤ 20000,0 ≤ Li ≤ 50000)

二、解题思路

由于N的值非常大,不可能枚举所有情况再求解,必须用一种比较高效的算法。木板的切割循序不确定,看似自由度很高,是先选择切出较短的,还是切较长的。如果我们把一种完全切割后的情况列举出来,会发现可以用贪心算法

惊奇的发现,这种切法的切割费用之和 == 所有非叶子节点权值和 == 叶子节点的权值 * 深度(根节点深度为0)

即 33 = 15 + 7 + 8 + 3 = 3*2 + 4*2 + 5*2 + 1*3 + 2*3

问题转化为,已知所有的叶子节点和根节点,求叶子节点的权值 * 深度和的最小值。

显然,使权值大的深度小,权值小的深度大。于是,此时的最佳切割方法应该具有如下性质:

    最短版和次短板应该是兄弟节点

这一性质在切割过程中始终成立,反过来,我们可以根据这种性质建立起对应的二叉树。即每次合并最小的,合并后的值加到总费用中。(注意建立的树不唯一,但每种的结果一样,所以选其中一种就行)

由于是每次取最小和次小合并,维护一个优先队列就行

三、代码实现

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<queue>
 4 using namespace std;
 5
 6 typedef long long LL;
 7 const int maxn = 20000 + 10;
 8 int n, L[maxn];
 9
10 void slove()
11 {
12     LL ans = 0;
13
14     //声明一个小值在前的优先队列
15     priority_queue<int, vector<int>, greater<int>>que;
16     for (int i = 0; i < n; i++)
17         que.push(L[i]);
18
19     //循环到只剩一块模板为止
20     while (que.size() > 1)
21     {
22         //取出最短的木板和次短的木板
23         int len1, len2;
24         len1 = que.top(); que.pop();
25         len2 = que.top(); que.pop();
26
27         ans += (len1 + len2);
28         que.push(len1 + len2);
29     }
30     printf("%lld\n", ans);
31 }
32
33 int main()
34 {
35     while (scanf("%d",&n) == 1)
36     {
37         for (int i = 0; i < n; i++)
38             scanf("%d", &L[i]);
39         slove();
40     }
41     return 0;
42 }

四、总结

这个题运用了很多哈夫曼树的思想,下一篇文章再讨论吧。

转载于:https://www.cnblogs.com/lfri/p/9457962.html

木板切割问题——贪心相关推荐

  1. 【挑战程序设计竞赛】- 2.2贪心法(硬币最少、区间覆盖、字典序最小、标记最少、木板切割)

    四年前犯的错再做一遍还是会犯. 四年前不看presentation要求,四年后依然PE. 四年前忘记longlong,四年后还是会忘. 2.2 贪心法 核心思想:不断选取最优策略. 例题1-硬币:有1 ...

  2. 木板切割最优matlab,矩形木板最优切割方案的设计与实现

    邹涵 李涛 朱婷婷 摘要:本文所设计的最优切割方案使用了回溯法和递归算法对最优切割问题进行划分,使木板最优切割问题转化为不同切割方式下木板的最大利用率问题,同时根据切割要求对切割方案进行优化,选择最优 ...

  3. 木板切割问题(二)——动态规划

    一.问题引入 有一根长度为L(L < 1000)的木棍,还有n(n < 50)个切割点的位置(按照从小到大排列).你的任务是在这些切割点的位置处把棍子切成n+1份,使得总费用最小.每次切割 ...

  4. 微信CRM管理系统功能分析

    SCRM与社交平台一样,拥有强大的算法,将用户进行精准化标签归类,以便更好地服务于他们的目标用户,提升企业经营效率. 过去CRM管理用户,如今SCRM智能标签管理,盘活用户社交圈,从而进行精准营销,能 ...

  5. poj3253求切割木板开销最少是多少, 赫夫曼编码

    /* poj3252: 农夫为修理栅栏,要将一块很长的木板切成N块,准备切成的木板的长度为L1,L2,L3--Ln.未切割木板之前的长度正好是是要切割的总长度. 每次切断木板时,需要的开销为这块木板的 ...

  6. 【POJ - 3253】Fence Repair(贪心,时光倒流)

    题干: Description Farmer John wants to repair a small length of the fence around the pasture. He measu ...

  7. 【树的算法】之求分割木板最小开销

    #include <iostream> #include <queue> using namespace std; /** * 原题: * 现需要将一块木板切成N块,每次切断木 ...

  8. 切割图形_模型教程丨切割机使用——结合实例

    点击这里查看上一期教程哦~ 半平米工坊:模型教程丨切割机操作手册​zhuanlan.zhihu.com 不知道大家看了上期的切割教程有没有去实际操作呢~有没有发现一些切割时不知道该如何处理的小问题~ ...

  9. Java蓝桥杯——贪心算法

    贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...

最新文章

  1. Spring Cloud Alibaba - 17 Nacos Config 配置中心 应用篇
  2. 你学废了 Mybatis 动态批量修改吗?
  3. Tomcat SSL/HTTPS 单向认证
  4. 最受欢迎的应用服务器
  5. Hibernate里面session.get()和session.load()的区别
  6. 交通运输部·车载导航系统——终端如何与服务器通信——玩转通信协议(源码下载)...
  7. C# NFine开源框架 调用存储过程的实现代码
  8. 使用Laya引擎开发微信小游戏(上)
  9. 计算机软件服务费分录,财务软件服务费会计分录是什么?
  10. docker 搭建本地 coredns 服务器
  11. 2345王牌浏览器如何使用小窗播放?
  12. 如何修改服务器凭据,如何更改操作数据库帐户的用户凭据
  13. (三)Kotlin加密/解密之AES和DES
  14. 元祖字典 java_元祖和字典
  15. spring_day01 demo代码
  16. Java Build工具Ant与Maven之比较
  17. Web应用架构搭建漏洞概念HTTP
  18. Debian 系统 安装nodejs
  19. php 手机摄像头,手机摄像头大光圈有什么作用
  20. 一般正态分布如何转化为标准正态分布?

热门文章

  1. componentWillUnmount父子组件触发先后
  2. 斐讯R1音箱安装悟空遥控,并实现DLNA推送
  3. 安装cPanelWHM 技巧
  4. ibm笔记本修复计算机开机按,联想thinkpad重装系统按什么键_联想thinkpad电脑重装系统按哪个键-win7之家...
  5. 多态的综合练习(Java)
  6. 程序员计算机常用快捷键,19个程序员都爱不释手的键盘快捷键,快来看看你知道几个又用过几个吧!...
  7. 求职套题2---各大公司
  8. SQL Server 2014 无法连接到服务器
  9. 服务器维护10月11魔兽,魔兽世界怀旧服10月11日免费转服第五期开启公告 免费转服详情...
  10. 运动世界校园破解刷跑步数据