1082: [SCOI2005]栅栏

题目:传送门

题解:

   是不是一开始在想DP?本蒟蒻也是qwq,结果很nice的错了ORZ

   正解:二分+搜索

   我们可以先把两种木材都进行排序,那么如果需要的最大木材比可提供的最大木材还要大的话,那么可以直接舍弃这种需要的木材。

   然后就可以进入二分,如果当前可以做贡献的提供木材加起来都没有前mid块需要木材大的话,很明显当前mid不ok

   返回判断值再记录答案就好了,注意一些小细节的优化

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<algorithm>
  6. typedef long long LL;
  7. using namespace std;
  8. bool flag;
  9. int n,m,mid;
  10. int a[],b[],bl[];
  11. LL sa;
  12. int sb[];
  13. void dfs(int ak,int bk,int w)
  14. {
  15. if(bk==)flag=;
  16. while(ak<=n && a[ak]<b[]){w+=a[ak];ak++;}//当前木材比最小的需求值还要小,跳下一个木材
  17. if(flag || ak>n)return;//如果已经合法或者没有符合要求的木材了就退出(因为已经排序过了啊)
  18. if(w+sb[mid]>sa)return;//如果有贡献的提供木材加起来都没有前mid块需要木材大,肯定不ok
  19. int t=ak,t1=ak,t2=bk,t3=w;
  20. if(b[bk]==b[bk+] && bk!=mid)t=bl[bk+];//小剪枝,如果我当前需要的木块和上一块一样,直接跳到上一次使用过的木材
  21. for(int i=t;i<=n;i++)
  22. if(a[i]>=b[bk])
  23. {
  24. bl[bk]=i;a[i]-=b[bk];
  25. bk--;
  26. dfs(ak,bk,w);
  27. ak=t1;bk=t2;w=t3;a[i]+=b[t2];
  28. }
  29. }
  30. int main()
  31. {
  32. scanf("%d",&n);for(int i=;i<=n;i++)scanf("%d",&a[i]);
  33. scanf("%d",&m);for(int i=;i<=m;i++)scanf("%d",&b[i]);
  34. sort(a+,a+n+);sort(b+,b+m+);
  35. while(b[m]>a[n])m--;//如果需要的最大木材比可提供的最大木材还要大,舍弃,直接m--
  36. int tot=;
  37. for(int i=;i<=n;i++)if(a[i]>b[])a[++tot]=a[i];
  38. n=tot;
  39. for(int i=;i<=n;i++)sa+=a[i];
  40. for(int i=;i<=m;i++)sb[i]=sb[i-]+b[i];
  41. int l=,r=m,ans=;
  42. while(l<=r)
  43. {
  44. mid=(l+r)/;
  45. flag=;
  46. dfs(,mid,);
  47. if(flag!=)ans=mid,l=mid+;
  48. else r=mid-;
  49. }
  50. printf("%d\n",ans);
  51. return ;
  52. }

bzoj1082: [SCOI2005]栅栏(二分答案搜索判断)的更多相关文章

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

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

  2. bzoj1082[SCOI2005]栅栏

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

  3. BZOJ1082: [SCOI2005]栅栏 题解

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

  4. [SCOI2005]栅栏 二分+dfs

    这个题真的是太nb了,各种骚 二分答案,肯定要减最小的mid个,从大往小搜每一个木板,从大往小枚举所用的木材 当当前木材比最短的木板还短,就扔到垃圾堆里,并记录waste,当 waste+sum> ...

  5. [luogu2329 SCOI2005] 栅栏(二分+搜索)

    传送门 Solution 纯搜索80分,加二分90分,再补一个小剪枝满分qwq 真.小剪枝:如果下一个的需求和当前相同,那么不需要再次从头开始试(看代码就明白了233) Code #include & ...

  6. 【BZOJ 1082】[SCOI2005]栅栏 二分+dfs

    对于最优解我们发现所有的最优解都可以是前多少多少个,那么我们就二分这个前多少多少个,然后用dfs去判解,我们发现在dfs的过程中如果不剪枝几乎必T,所以我们就需要一些有效的剪枝 I. 我们在枚举过程中 ...

  7. CF 371C-Hamburgers[二分答案]

    C. Hamburgers time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774

    Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...

  9. 【二分答案】 【POJ3497】 【Northwestern Europe 2007】 Assemble 组装电脑

    Assemble Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3171   Accepted: 1013 Descript ...

随机推荐

  1. 百度编辑器图片在线流量返回url改动

    百度编辑器中返回的是我们server中的url,有时并非我们须要的,比方图文编辑中.我想在线浏览上传过的图片 ,那么我返回的应该是腾讯server上面的url.这样才不会被腾讯的过滤器过来掉,全部我们 ...

  2. h5-注册成功

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAAGnCAIAAABuMVpqAAAgAElEQVR4nOy9eXQTd57om2R6uvtO3z ...

  3. Android持久化保存cookie

    在解析网页信息的时候,需要登录后才能访问,所以使用httpclient模拟登录,然后把cookie保存下来,以供下一次访问使用,这时就需要持久化cookie中的内容. 在之前先科普一下基础知识: 什么 ...

  4. Batch Normalization的算法本质是在网络每一层的输入前增加一层BN层(也即归一化层),对数据进行归一化处理,然后再进入网络下一层,但是BN并不是简单的对数据进行求归一化,而是引入了两个参数λ和β去进行数据重构

    Batch Normalization Batch Normalization是深度学习领域在2015年非常热门的一个算法,许多网络应用该方法进行训练,并且取得了非常好的效果. 众所周知,深度学习是应 ...

  5. ORACLE查询闪回

    在Oracle中如果错误地提交了修改操作,然后想查看修改前的值,这时候可以使用查询闪回(query flashback). 查询闪回可以根据根据一个时间值或者系统变更号(SCN)进行. 执行闪回操作, ...

  6. nginx的安装步骤

    nginx学习资料;https://zhuanlan.zhihu.com/p/34943332 1.下载nginx的安装包:https://nginx.org/en/download.html 2. ...

  7. 如何在maven项目中使用spring

    今天开始在maven项目下加入spring. 边学习边截图. 在这个过程中我新建了一个hellospring的项目.于是乎从这个项目出发开始研究如何在maven项目中使用spring.鉴于网上的学习资 ...

  8. 用VS2015创建ASP.NET Web Forms 应用程序

    在 Visual Studio 2015 中,按着以下步骤创建一个 Web Forms 应用程序项目: 1.起始页/文件--->新建项目--->已安装--->模板--->Vis ...

  9. 动态修改SeekBar的颜色

    方法一 1. 需求:需要改变其默认颜色,样式 2.滑竿样式 seekbar.xml <?xml version="1.0" encoding="utf-8" ...

  10. uva 11624 Fire! 【 BFS 】

    按白书上说的,先用一次bfs,求出每个点起火的时间 再bfs一次求出是否能够走出迷宫 #include<cstdio> #include<cstring> #include&l ...