挑战性题目DSCT102:木板切割问题

问题描述

将一根长度为L的木板切割为N块,切割之后的木板长度为l1,l2,...,lNl_1, l_2, ..., l_Nl1​,l2​,...,lN​.每次切割操作的代价为该块木板的长度。例如将长度为101010的目标切割成333和777,那么切割开销为101010。给定最终切割目标,请问最小的切割开销?

例如,输入8 5 8,输出34。

题解

运用贪心算法,不难发现每次从现有木板中选取长度最小的两块合并,能够使总的开销最小。一个较直观的理解为,越早合并的木板,其在后面的合并中重复支出开销的次数越多,所以我们应该先合并长度最小的两块木板,后合并长度较大的木板。

为了实现这个过程,我们需要一个数据结构,其能快速的在所有元素中提取出最小的元素,并支持元素的插入与删除。每次我们都提取出现有最小的两个元素,将其合并后把新元素再放回集合。于是自然能想到堆,利用堆我们就能在O(log2n)O\left({log}_2{n}\right)O(log2​n)的时间内完成删除插入操作,O(1)O\left(1\right)O(1)完成提取最小元素。整个过程的复杂度即为O(nlog2n)O\left(n{log}_2{n}\right)O(nlog2​n)。

代码

#pragma GCC optimize(2)
#include<queue>
#include<cstdio>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
__gnu_pbds::priority_queue<long long,greater<long long> >dui;
int n;
long long ans;
void out(long long x){if(x>9)out(x/10);putchar(x%10+'0');}
int main(int argc,char* argv[])
{n=argc-1;for(int i=1;i<=n;++i)dui.push(atoll(argv[i]));for(long long min1,min2;dui.size()>1;){min1=dui.top(),dui.pop();min2=dui.top(),dui.pop();ans+=min1+min2;dui.push(min1+min2);}//printf("%lld\n",ans);out(ans);return 0;
}

挑战性题目DSCT102:木板切割问题相关推荐

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

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

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

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

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

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

  4. 木板切割问题——贪心

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

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

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

  6. P1334 瑞瑞的木板

    题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...

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

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

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

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

  9. SSLOJ 1335.蛋糕切割

    题目 1335.蛋糕切割 时间限制:1000MS内存限制:256000KB 题目描述 Garfield非常喜欢巧克力蛋糕.奇怪的是,她把蛋糕分成了N行M列的网格.馋嘴的她想知道,沿对角线的一刀能切到的 ...

  10. 【u009】瑞瑞的木板

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每 ...

最新文章

  1. 【Qt】通过QtCreator源码学习Qt(七):插件管理类简介
  2. 复习07统计学习方法(支持向量机SVM)---图片版
  3. python祝福祖国代码_国际文交所:9月17日-10月15日《祝福祖国信卡》《澳门爱与祝愿套票》《北京精神封》3个提货转仓公告...
  4. SQL:判断字符类型是否为数字
  5. 如何在博客园的博客中添加可运行的JS(转载)
  6. 7.10.7740.16
  7. python文件式_python中文件操作的六种模式及对文件某一行进行修改的方法
  8. 网易云音乐——网易云云盘上传音乐自动改名的解决方法
  9. Python 快速验证代理IP是否有效
  10. 分段三次hermite插值python
  11. 成为技术传播者(二):Why and Why NOT
  12. 视网膜屏 retina屏
  13. html中style写啥,style标签的作用
  14. python代码画人物_Python绘制可爱的卡通人物 | 【turtle使用】
  15. PreScan 教程:0. PreScan与Matlab连接
  16. ARMv7 GICv2 GenericTimer 实战演练
  17. 某某文学网站小说爬虫
  18. 解决ubuntu和windows电脑之间无法复制粘贴问题
  19. 今年IBM公司庆祝成立100周年
  20. Spring 源码解析 - Bean创建过程 以及 解决循环依赖

热门文章

  1. 403. Frog Jump
  2. 283.移动零 (力扣leetcode) 博主可答疑该问题
  3. mysql 当前时间的一周后_mysql查询当前时间,一天内,一周,一个月内的sql语句...
  4. selenium-远程调用
  5. ubuntu之路——day7.1 衡量模型好坏的因素偏差和方差biasvariance 以及在深度学习中的模型优化思路...
  6. 第 7 章 Neutron - 075 - 为 Neutron 准备物理基础设施(I)
  7. pageHelper 分页插件使用
  8. C# 控制台如何播放音频文件
  9. iOS 一种很方便的构造TarBar
  10. 使用python的Tkinter构建应用程序