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

思路:

首先,此题属于最小值最大化问题,果断下二分答案,而此题适用于left no   AND   right no   BUT   mid yes 的二分查找。

唔,据网上blogs,背包动归的写法还不如搜索+剪枝,所以此题约等于贪心题目,于是有了:

  • 优化part 1:将店主可提供的木板和farmer John的需要木板进行排序。

那么,暴搜的框架就不再赘述,下面我们看看此题的剪枝。。。
可行性剪枝1:自然是搜完啦farmer John要买的最小mid个的木板后,向二分查找return 1咯。
可行性剪枝2:累计切割后剩下不能再用的木板,计为waste,处理要买的木板的前缀和,计为s[],并且滴,累积商店里所有木板的长度为sum(好吧,tot||total||cnt也行,但是sum s是更和谐的),当s[mid](当前要买的mid个木板总长)+waste>sum时,也就是搜索目标最小值所用最优木板长度比可承受长度还长,那么剪枝。
优化:当枚举的下一个要买到的木板长度和当前搞好的木板长度相同时,继续从当前商店的用过切过的木板i开始解决,否则从1开始。
此题大概就是如此吧,具体的那些难以言表东西交给我的代码解决吧!
二分答案技能get!
//最近get技能read()函数,陷入三目运算符中不能自拔(表示noip不能用啊)。

1592592

  ksq2013 1082 Accepted 828 kb 4 ms C++/Edit 1287 B 2016-08-15 17:16:48
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int l,r,mid,ans=0;
int n,m,c[51],b[51],a[1001],s[1001]={0},sum=0;
int read()
{
int x=0,c=getchar(),f=1;
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)x=x*10+c-48,c=getchar();
return x*f;
}
bool dfs(int last,int waste,int cur)
{
if(!cur)return 1;
if(waste+s[mid]>sum)return 0;
for(int i=last;i<=m;i++)
if(c[i]>=a[cur]){
c[i]-=a[cur];
int tmp=c[i]<a[1]?c[i]:0;
int nxt=a[cur]==a[cur-1]?i:1;
if(dfs(nxt,waste+tmp,cur-1))
return 1;
c[i]+=a[cur];
}
return 0;
}
int main()
{
m=read();
for(int i=1;i<=m;i++)
b[i]=read(),sum+=b[i];
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
sort(a+1,a+1+n);
sort(b+1,b+1+m);
for(int i=1;i<=n;i++)
s[i]=s[i-1]+a[i];
for(;s[n]>sum;n--);
l=0,r=n;
while(l<=r){
mid=(l+r)>>1;
memcpy(c,b,sizeof(b));
if(dfs(1,0,mid))ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}

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]栅栏 题解

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

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

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

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

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

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

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

  7. 【bzoj1082】 SCOI2005—栅栏

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

  8. 【bzoj1082】栅栏[SCOI2005]

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

  9. SCOI2005栅栏

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

随机推荐

  1. 无线安全审计工具 Fern WiFi Cracker

    使用这款工具前最好自定义一个MAC地址,以便隐藏我们的真实MAC地址信息. 由于Fern WiFi Cracker是图形界面的,不需要敲命令,所以操作起来比Aircrack-ng简单了许多. 首先选择 ...

  2. Excel数据导入到Sharepoint List

    这个功能是从XML中读取需要导入到Sharepoint List的列名字,然后把Excel中对应的数据导入到Sharepoint List中.基本原理,把Excel中数据临时放到Datatable中, ...

  3. Oracle11g 统计信息——统计信息自动收集任务

    参考文献: Oracle11g 统计信息(一)-----统计信息自动收集任务 背景: 在使用cacti监控oracle数据库IO的时候发现每天晚上10点钟的时候oracle数据库读写明显增加,如下图所 ...

  4. Android MediaPlayer的生命周期

    MediaPlayer的状态转换图也表征了它的生命周期,如下: 这张状态转换图清晰的描述了MediaPlayer的各个状态,也列举了主要的方法的调用时序,每种方法只能在一些特定的状态下使用,如果使用时 ...

  5. android自定义activity

    今天公司有个需要需要自动弹出界面,而dialog又不符合要求,所以自定义的一个activity的样式 首先在androidmainfest.xml上注册你的activity <activity ...

  6. 关于插件管理器Alcatraz

    如何安装插件管理器Alcatraz:去github下载一个Alcatraz安装包,然后运行一下. 会弹出 记得选择左边的Load Bundle 退出Xcode 重新运行一下就OK 了. 然后就可以看到 ...

  7. MVC 生成图片,下载文件

    /// <summary> /// 生成图片 /// </summary> /// <param name="collection"></ ...

  8. [读书笔记] Head First 设计模式

    OO基础 抽象 封装 多态 继承 OO原则 原则 描述 封装变化 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起. 把会变化的部分取出来并“封装”起来,好让其他部分不 ...

  9. java反射机制一个例子

    import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try ...

  10. C#程序猿电脑重装记录

    最近比较空了,闲的手痒,将自己的笔记本进行了重装,之前每次重装都没有记录,这次将本次重装过程记录下来,以便下次参考 1 首先不用说了WIN7旗舰版装好,驱动装好 2 开启Administrator用户 ...