暴力出奇迹……

原题:

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

m<= 50,n <= 1000

第一眼就脑补出暴力做法二分+dfs,然而想了想觉得dfs的复杂度非常不大丈夫啊

然后搜题解,就是dfs……
首先需要的木条递增排序然后降序dfs,对于每次搜到的木条遍历所有大木条

两个剪枝

搞个前缀和s[i]表示从第1到第i个需要的木条的长度和,用tot表示提供的木条的总长度,如果某个大木条剩下的部分比需要的最小的木条还短,这个大木条就相当于浪费掉了,加到一个waste里面,如果某层dfs中dfs到的木条的前缀和+waste比tot大,就直接return

如果当前木条和下一层要dfs到的木条长度一样,下一层搜的时候就直接从当前木条使用的大木条往后遍历(如果不一样就只能从1开始遍历了

然后这样剪枝直接把复杂度50^1000的dfs_1s跑过了……
暴力出奇迹……

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
int n,m; int a[],b[];
int wst=,s[],tt=,p;
bool dfs(int x,int y){
if(!x) return true;
if(wst+s[p]>tt) return false;
bool flg;
for(int i=y;i<=n;++i)if(a[i]>=b[x]){
a[i]-=b[x];
if(a[i]<b[]) wst+=a[i];
flg=dfs(x-,(b[x]==b[x-] ? i : ));
if(a[i]<b[]) wst-=a[i];
a[i]+=b[x];
if(flg) return true;
}
return flg;
}
int bnrsch(int l,int r){
int md;
while(l+<r){ md=(l+r)>>; (dfs(p=md,) ? l : r)=md;}
return dfs(r,) ? r : l;
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n;
for(int i=;i<=n;++i) tt+=(a[i]=rd());
sort(a+,a+n+);
cin>>m;
int mn=,mx=m;
for(int i=;i<=m;++i) b[i]=rd();
sort(b+,b+m+);
for(int i=;i<=m;++i){
s[i]=s[i-]+b[i];
mn+=(a[i]>b[i]); if(s[i]>tt) mx=min(mx,i-);
}
cout<<bnrsch(mn,mx)<<endl;
return ;
}

【BZOJ1082】【SCOI2005】栅栏的更多相关文章

  1. [BZOJ1082][SCOI2005]栅栏 二分+搜索减枝

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2430  Solved: 1034[Submit][Status ...

  2. bzoj1082: [SCOI2005]栅栏(二分答案搜索判断)

    1082: [SCOI2005]栅栏 题目:传送门 题解: 是不是一开始在想DP?本蒟蒻也是qwq,结果很nice的错了ORZ 正解:二分+搜索 我们可以先把两种木材都进行排序,那么如果需要的最大木材 ...

  3. bzoj1082[SCOI2005]栅栏

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

  4. BZOJ1082: [SCOI2005]栅栏 题解

    题目大意: 有一些木材,可以没有浪费地将一根木材分成几块木板(比如长度为10的木板可以切成长度为8和2的两块木板).现在你希望得到一些长度的木板,问通过分割木材最多能得到几块想要的木板. 思路: 首先 ...

  5. 【BZOJ1082】[SCOI2005]栅栏(搜索)

    [BZOJ1082][SCOI2005]栅栏(搜索) 题面 BZOJ 洛谷 题解 随便写个爆搜,洛谷上就\(80\)分了.先放爆搜代码: #include<iostream> #inclu ...

  6. 洛谷 P2329 [SCOI2005]栅栏 解题报告

    P2329 [SCOI2005]栅栏 题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了 ...

  7. bzoj 1082: [SCOI2005]栅栏 题解

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2340  Solved: 991[Submit][Status] ...

  8. 【bzoj1082】 SCOI2005—栅栏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1082 (题目链接) 题意 给出m块木柴,以及n块木板,要求将m块木柴做木板,要求将木柴切割成与木板一 ...

  9. 【bzoj1082】栅栏[SCOI2005]

    显然我们取的肯定是前ans块木板.然后砍的木材也应该是从小到大砍(如果小的木材可以满足条件,就一定不会去动大的木材) 所以两遍排序. 二分答案. 然后对于要取的每块木板,我们搜索它是在第x块木板上砍下 ...

  10. SCOI2005栅栏

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

随机推荐

  1. 生成器 Generators

    function* quips(name) { yield "你好 " + name + "!"; yield "希望你能喜欢这篇介绍ES6的译文&q ...

  2. mySQL 分组查询,根据分组的字段,取最小值

    今天看到别人问的问题,给别人写了一条sql! CREATE TEMPORARY TABLE tmp_table ( id INTEGER not NULL, uname VARCHAR(10) NOT ...

  3. [Leetcode 881]船救人 Boats to Save People 贪心

    [题目] The i-th person has weight people[i], and each boat can carry a maximum weight of limit. Each b ...

  4. 延迟载入Dll(动态载入Dll)

    windows核心编程(第五版)20.3节的延迟载入Dll 延迟载入Dll技术出现的原因: 因为DLL的加载是比较浪费时间的,特别是大型软件加载,因此,这项技术是在应对软件初始化过程中避免浪费太多的时 ...

  5. vue-router 不重新加载问题

    -----------------------同一个路由不同的参数页面不重新加载的解决版本---------- // 监听 route , watch: { '$route': 'getContent ...

  6. 自动化测试-21.RobotFrameWork配置安装

    更新pip python -m pip install --upgrade pip 1安装robotframework --pip install robotframework 2. 安装支持框架的运 ...

  7. 【Python】利用正则解析xml练习题

    { "date": "18-03-29 06:04:47", "data": { "deviceType": 1, &q ...

  8. html 网页代码大全,总结,使用

    )贴图:<img src="图片地址"> )加入连接:<a href="所要连接的相关地址">写上你想写的字</a> )贴图 ...

  9. gl_PointSize偶数像素表现精准,基数会模糊化。

  10. Linux 查看CPU信息、机器型号等硬件信息[转]

    查看CPU信息(型号) # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c       8  Intel(R) Xeon(R) CPU    ...