1082: [SCOI2005]栅栏

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1341 Solved: 583
[Submit][Status][Discuss]
Description

农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材。于是农夫约翰到木材店购买木材。可是木材店老板说他这里只剩下少部分大规格的木板了。不过约翰可以购买这些木板,然后切割成他所需要的规格。而且约翰有一把神奇的锯子,用它来锯木板,不会产生任何损失,也就是说长度为10的木板可以切成长度为8和2的两个木板。你的任务:给你约翰所需要的木板的规格,还有木材店老板能够给出的木材的规格,求约翰最多能够得到多少他所需要的木板。

Input

第一行为整数m(m<= 50)表示木材店老板可以提供多少块木材给约翰。紧跟着m行为老板提供的每一块木板的长度。接下来一行(即第m+2行)为整数n(n <= 1000),表示约翰需要多少木材。接下来n行表示他所需要的每一块木板的长度。木材的规格小于32767。(对于店老板提供的和约翰需要的每块木板,你只能使用一次)。

Output

只有一行,为约翰最多能够得到的符合条件的木板的个数。

Sample Input

4

30

40

50

25

10

15

16

17

18

19

20

21

25

24

30
Sample Output

7
HINT

25切出 21 30切出 20 40切出 19、18 50切出 15、16、17
写在前面:这几天学长讲课,有一个专题就是关于搜索的,于是就找到这道题做,结果……T成shi了


思路:直接暴搜,但是加的优化很多,下面列举一下主要的
1.对现有和所需排序,之后搜索的时候一定是先满足小的需求再满足大的需求(贪心思路)
2.对于现有木材中的max,凡是需求中大于max的,都可以直接扔掉不要,因为它们一定切不出来(同样可用于需求中的min)
3.二分,在0-m中二分判断是否可以达到mid,一定是从1-mid块木板(已升序排列)中切最优
4.如果剩余木材小于还没切但要切的需求总量,就返回
5.如果是相同的需求,我们可以让它们强制有序,即i需求用j木材切,若i+1需求与i相同,则i+1一定用大于等于j木材切

还有一些po主自己加的,不知道能优化多少
6.随便搞个贪心,算一下浪费量trash,在搜索中可以进行判断,如果浪费更多了那必定不优于最初的贪心(代码中的实现不尽人意,应该还能在精进一下,比如每次算出更优答案时可以更新浪费量trash)
7.接上面,顺便算出最初贪心时能切minn块,然后答案一定是在minn-m间,比0-m要优

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<ctime>
using namespace std;
int n,m,ans,minn,trash,l,r,mid;
bool flag;//flag为搜索是否能达到mid的标志
int have[52],need[1010],sum[1010],tot;//have[0]为当前剩余木材,tot为总木材,sum记录排序后需求的前缀和
inline void dfs(int x,int y)
{if (!y) {flag=1;return;}if (flag||have[0]-sum[y]>trash||have[0]-sum[y]<0) return;//接6,4for (int i=x;i<=n;i++)if (have[i]-need[y]>=0){have[i]-=need[y];have[0]-=need[y];if (need[y]==need[y-1]) dfs(i,y-1);//接5else dfs(1,y-1);have[i]+=need[y];have[0]+=need[y];}
}
main()
{scanf("%d",&n);int t=0,num=n;for (int i=1;i<=n;i++) scanf("%d",&have[i]),have[0]+=have[i],t=max(have[i],t);tot=have[0];scanf("%d",&m);for (int i=1;i<=m;i++)scanf("%d",&need[i]);sort(have+1,have+n+1);sort(need+1,need+m+1);//接1for (int i=1;i<=m;i++)if (need[i]<=t) sum[i]=sum[i-1]+need[i];else m=i-1;//接2for (int i=1;i<=m;i++){while (t-need[i]<0&&num>=1) trash+=t,t=have[--num];if (num>=1&&t-need[i]>=0) minn++,t-=need[i];}trash+=t;for (int i=num-1;i>=1;i--) trash+=have[i];//这里被坑了,刚开始忘记吧未被切过的木材算进trash了l=minn;r=m;mid=(r+l)/2;//接7while (l<=r)//接3{flag=0;dfs(1,mid);if (flag) ans=mid,l=mid+1;else r=mid-1;mid=(l+r)/2;}printf("%d",ans);
}

【BZOJ1082】【codevs2456】栅栏,让人抓狂的优化剪枝相关推荐

  1. 如何重置计算机服务到默认状态,电脑慢到让人抓狂?教你如何将Windows10还原到出厂设置...

    原标题:电脑慢到让人抓狂?教你如何将Windows10还原到出厂设置 来源:腾讯数码 关于Windows系统,我们都知道,很少有Windows电脑会比出厂时更快,更容易使用,因为随着时间的累积,电脑里 ...

  2. tt语音服务器老是炸,TT语音:巨真实的开黑情况,奇葩开黑队友,每一种都让人抓狂...

    原标题:TT语音:巨真实的开黑情况,奇葩开黑队友,每一种都让人抓狂 现在大火的游戏基本上都是竞技类游戏,需要多人联手配合赢得胜利.因此,玩家之间相互开黑就成了常态,和路人一起开黑更是经常的事情.尤其是 ...

  3. 盘点那些年让人抓狂的计算机术语翻译

    文章首发于公众号「蝉沐风」,欢迎关注 不知道大家刚开始学习计算机的时候有没有被某些概念折磨的经历,可能会有很长一段时间无法理解某一个概念.有没有这么一种可能,不是我们的水平问题,而是这些概念本身翻译地 ...

  4. 20个让人抓狂的脑筋急转弯

    1. 一个人的钱包掉了,他首先应怎么办?(答案:捡起来)       但他没捡,为什么?(答案:因为他是比尔·盖茨) 2. 一只公鸡抓着刚下蛋的母鸡痛打,为什么?(答案:因为那只母鸡下了一个鸭蛋) 3 ...

  5. oracle 让人抓狂的错误之 null值 与 无值(无结果)-开发系列(一)

    近期.在做开发.写存过的时候碰到一些问题,找了好长时间才发现原因.并且是曾经不知道的. 所以在这给记下来 给自己备忘和大家參考. 一 .null值 以下举个最简单的样例.寻常工作其中肯定比这个sql复 ...

  6. 这些让人抓狂的烂代码,你碰到几种?

    刚入程序员这行的时候经常听到一个观点:你要把精力放在ABCD(需求文档/功能设计/架构设计/理解原理)上,写代码只是把想法翻译成编程语言而已,是一个没什么技术含量的事情. 当时的我在听到这种观点时会有 ...

  7. Spring Boot - 让人抓狂的ClassNotFoundException

    我们的项目基于Spring Boot + Maven,采用Intelli IDEA工具进行开发.代码在另一名同事的机器上检出之后,启动项目时,始终出现如下错误提示: 03-11 15:41:23[or ...

  8. 用这个工具,让人抓狂的领导驾驶舱报表五步搞定

    今天讲个实操课,如何快速制作领导驾驶舱! 既然是快速制作,那就不多说废话了,我们看看是怎么样5个步骤就可以快速做出漂亮的领导驾驶舱! 第一步:理清需求,设计草图. 纵然再华丽的外表也需要有内在做基础. ...

  9. 程序员设计的这些作品震惊UI界!真让人抓狂!直接笑还是走程序?

    大家有没有想过,如果程序员gg们来做设计,这个世界会变成什么样子? 如果哪天设计师消失了,这个世界会变成什么样? 经常逛淘宝的朋友会发现,在淘宝或者其他电商网站,有一个"设计"流派 ...

最新文章

  1. netfilter/iptables全攻略
  2. yii2 请求外部api_微服务架构之「 API网关 」
  3. 【SpringBoot零基础案例02】【IEDA 2021.1】SpringBoot框架集成SpringMVC
  4. python16进制转2进制流_将十六进制文件转换为二进制文件
  5. Nginx反向代理与负载均衡等配置文件示例
  6. css 商城 两列_css大法之使用伪元素实现超实用的图标库(附源码
  7. 结对编程 贪吃蛇项目-开发环境搭建过程
  8. 22. GD32F103C8T6入门教程-RTC的时间设置、读取日历转换
  9. 谷歌浏览器怎么网页截图
  10. 题解 CF1399D 【Binary String To Subsequences】
  11. Tensorflow异常集锦
  12. iOS比较两张图的相似度
  13. winrar大全+压缩
  14. 软考高级 真题 2017年上半年 信息系统项目管理师 论文
  15. 单片机加减法C语言,单片机的加减法原理
  16. 网页视频怎么录制?这两个方法操作简单,录制高清!
  17. 金庸小说人物知识图谱构建——图谱可视化
  18. 如何提高流量主广告收益,这些方法你可以用用
  19. Mysql数据库管理系统原理及基本操作
  20. MoR03r's Blog

热门文章

  1. 魅族mx四核即将使用android,魅族MX四核智能手机发布
  2. 代数学笔记11: 分圆域,分圆多项式,求解17次方程
  3. 为Sublime Text 3的C++编译器(g++)添加C++11标准的方法
  4. 常用不等式及证明思路总结(一)
  5. python 列表(list)去掉末尾的0或其他某个字符
  6. python - EDA - 1 统计缺失值
  7. 注意力机制BAM和CBAM详细解析(附代码)
  8. 弹簧触摸开关原理图_电梯弹簧抱闸调整
  9. python中控制代码块逻辑关系_一、Python基础知识
  10. Katalon Recorder录制脚本