P2329 [SCOI2005]栅栏

题目描述

农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材。于是农夫约翰到木材店购买木材。可是木材店老板说他这里只剩下少部分大规格的木板了。不过约翰可以购买这些木板,然后切割成他所需要的规格。

而且约翰有一把神奇的锯子,用它来锯木板,不会产生任何损失,也就是说长度为10的木板可以切成长度为8和2的两个木板。

你的任务:给你约翰所需要的木板的规格,还有木材店老板能够给出的木材的规格,求约翰最多能够得到多少他所需要的木板。

输入输出格式

输入格式:

第一行为整数\(m(m<= 50)\)表示木材店老板可以提供多少块木材给约翰。紧跟着m行为老板提供的每一块木板的长度。

接下来一行(即第\(m+2\)行)为整数\(n(n <= 1000)\),表示约翰需要多少木材。

接下来\(n\)行表示他所需要的每一块木板的长度。木材的规格小于\(32767\)。(对于店老板提供的和约翰需要的每块木板,你只能使用一次)。

输出格式:

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


比较正常的搜索剪枝题目。

首先我们想对某个东西排个序剪枝一下,因为在搜索中木材的长度是动态的,所以对它排序没得用。

对木板排的话又不能确定上界。

自然的想到二分搞一个上界。

然后我们对木板排序,从大往小放。

剪枝1:当当前木板和下一块等长,下次从同一块木材搜索

剪枝2:找到当前所有还可能贡献答案(剩余长度大于最小的木板)的木材,然后计算是否大于剩下的木板


Code:

#include <cstdio>
#include <algorithm>
int n,m_,m,stick[52],f[1002],need[1002],mi=1<<30;
int dfs(int dep,int s)
{
if(!dep) return 1;
int mx=0,sum=0;
for(int i=1;i<=m;i++)
if(stick[i]>=need[1])
sum+=stick[i];
if(sum<f[dep]) return 0;
for(int i=s;i<=m;i++)
{
if(stick[i]>=need[dep])
{
stick[i]-=need[dep];
mx|=dfs(dep-1,need[dep]==need[dep+1]?i:1);
stick[i]+=need[dep];
if(mx) return 1;
}
}
return mx;
}
int main()
{
scanf("%d",&m_);
for(int i=1;i<=m_;i++) scanf("%d",stick+i);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",need+i),mi=mi<need[i]?mi:need[i];
for(int i=1;i<=m_;i++)
if(stick[i]>=mi)
stick[++m]=stick[i];
std::sort(need+1,need+1+n);
for(int i=1;i<=n;i++) f[i]=f[i-1]+need[i];
if(!m) return puts("0"),0;
int l=1,r=n;
while(l<r)
{
int mid=l+r+1>>1;
if(dfs(mid,1)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
return 0;
}

2018.10.10

洛谷 P2329 [SCOI2005]栅栏 解题报告的更多相关文章

  1. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  2. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  3. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  4. 洛谷 P2345 奶牛集会 解题报告

    P2345 奶牛集会 题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨 ...

  5. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  6. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  7. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  8. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  9. 洛谷 [HNOI2014]道路堵塞 解题报告

    [HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...

随机推荐

  1. 判断一个Object是否为数组Array的方法

    1.constructor constructor 属性是每个有原型对象的原型成员 arr.constructor == Array  //true说明arr是数组 2.isArray arr.isA ...

  2. 【转载】CString,string,char*之间的转换

    本文转自 <> 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌 ...

  3. python -- 输出异常详细信息

    在使用try:  except:  捕获异常后,想要获取到异常信息的详细内容另做它用,可以使用python的内置模块traceback进行获取. traceback.print_exc() 直接打印异 ...

  4. Head First Java-图形化界面

    Head First Java是本挺好的书,讲的比较清楚和简单.主要看原则.概念啥的.语法什么的,还是靠谷歌吧:) 这部分的笔记也有很多了,最近会努力更新和搬运.顺便自己也重新读一下. 就酱.想要这本 ...

  5. acm总结

    注意事项: 不要轻易中途变换思路修改代码 发现有样例无法通过可以用if强行通过 注意输入输出形式(long long为lld,无符号为llu). 开过1亿的int型数组 Long long能读入输出1 ...

  6. No module named appium

    在脚本中会有:from appium import webdriver 第一次运行时可能会遇到这样的error:No module named appium 之所以会报这样的error是因为没有装cl ...

  7. Android stadio butternife工具

    http://www.androidchina.net/5068.html svn今天我对它有了更深的认识.我知道了有冲突了不能提交.但是可以update,updata之后就会有冲突的东西生成,如果你 ...

  8. linux centos7--linux和window共享文件(samba)

    这里以VMWARE与主控真机来做实现实现 由于SMB在centos中自带,所以,无需像网上说的样子,要这删除,那卸载,直接搜索是否存在SAMBA的安装文件 一 查询包是否存在 [root@localh ...

  9. (D)spring boot使用注解类代替xml配置实例化bean

    bean经常需要被实例化,最常见的就是new一个呗,Bean bean = new Bean(),方便好用还快捷. 然而在我们刚开始学习写i项目的时候却发现,new不好用哦,并且也不报错,根本不知道怎 ...

  10. windows下进程间通信(转)

    摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microsof ...