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

题面

BZOJ

洛谷

题解

随便写个爆搜,洛谷上就\(80\)分了。先放爆搜代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. inline int read()
  5. {
  6. int x=0;bool t=false;char ch=getchar();
  7. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  8. if(ch=='-')t=true,ch=getchar();
  9. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  10. return t?-x:x;
  11. }
  12. int n,m,a[55],b[1010],l[55],ans;
  13. void dfs(int x,int s)
  14. {
  15. if(s+n-x+1<=ans)return;
  16. if(x==n+1){ans=s;return;}
  17. dfs(x+1,s);
  18. for(int i=1;i<=m;++i)
  19. if(l[i]+b[x]<=a[i])
  20. l[i]+=b[x],dfs(x+1,s+1),l[i]-=b[x];
  21. }
  22. int main()
  23. {
  24. m=read();
  25. for(int i=1;i<=m;++i)a[i]=read();
  26. n=read();
  27. for(int i=1;i<=n;++i)b[i]=read();
  28. dfs(1,0);
  29. printf("%d\n",ans);
  30. }

然后发现可以二分,二分之后再玄学剪枝就好了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. inline int read()
  6. {
  7. int x=0;bool t=false;char ch=getchar();
  8. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  9. if(ch=='-')t=true,ch=getchar();
  10. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  11. return t?-x:x;
  12. }
  13. int n,m,a[55],b[1010],sum,tot,s[1010];
  14. bool dfs(int x,int lst)
  15. {
  16. if(!x)return true;
  17. if(sum+s[x]>tot)return false;
  18. for(int i=lst;i<=m;++i)
  19. if(b[x]<=a[i])
  20. {
  21. a[i]-=b[x];if(a[i]<b[1])sum+=a[i];
  22. bool fl=dfs(x-1,b[x]==b[x-1]?i:1);
  23. if(a[i]<b[1])sum-=a[i];a[i]+=b[x];
  24. if(fl)return true;
  25. }
  26. return false;
  27. }
  28. int main()
  29. {
  30. m=read();for(int i=1;i<=m;++i)tot+=(a[i]=read());
  31. n=read();for(int i=1;i<=n;++i)b[i]=read();
  32. sort(&a[1],&a[m+1]);sort(&b[1],&b[n+1]);
  33. for(int i=1;i<=n;++i)s[i]=s[i-1]+b[i];
  34. while(s[n]>tot)--n;
  35. int l=0,r=n,ret=0;
  36. while(l<=r)
  37. {
  38. int mid=(l+r)>>1;
  39. if(dfs(mid,1))l=mid+1,ret=mid;
  40. else r=mid-1;
  41. }
  42. printf("%d\n",ret);return 0;
  43. }

【BZOJ1082】[SCOI2005]栅栏(搜索)的更多相关文章

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

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

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

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

  3. bzoj1082[SCOI2005]栅栏

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

  4. BZOJ1082: [SCOI2005]栅栏 题解

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

  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. [luogu2329 SCOI2005] 栅栏(二分+搜索)

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

随机推荐

  1. Java IO 文件

    在java应用程序中,文件是一种常用的数据源或者存储数据的媒介.所以这一小节将会对Java中文件的使用做一个简短的概述.这里只提供一些必要的知识点. 通过Java IO读文件 如果你需要在不同端之间读 ...

  2. intellij idea新建maven项目,一直loading archetype list.....

    不知道什么时候开始,在idea里新建maven项目时,在new module页面,一直显示loading archetype list....,导致一直没办法新建.后来我以为是防火墙问题,各种设置还是 ...

  3. WPF编程,通过Path类型制作沿路径运动的动画一种方法。

    原文:WPF编程,通过Path类型制作沿路径运动的动画一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/de ...

  4. Codeforces 948D Perfect Security(字典树)

    题目链接:Perfect Security 题意:给出N个数代表密码,再给出N个数代表key.现在要将key组排序,使key组和密码组的亦或所形成的组字典序最小. 题解:要使密码组里面每个数都找到能使 ...

  5. 搭建 Guacamole 并解决各种坑和创建不了虚拟驱动器导致无法实现文件传输的方法

    系统类型版本:centos7 64位 结果:最终跑通了项目并且实现了虚拟驱动器的文件传输功能,添加了中文支持 反思总结: 先查看官方文档的Q&A,找找有没有类似的错误,然后如果有错误日志或者现 ...

  6. 前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]

    --------------------- 作者:吴潇雄 来源:CSDN 原文:https://blog.csdn.net/weixin_43439741/article/details/835118 ...

  7. 说说 Python 的变量以及简单数据类型

    1 变量 先来看一个示例: news="我国第一个人工智能规划问世"print(news) 运行结果: 可以看出使用 Python 定义变量很简单,甚至都不需要指定变量的类型. 1 ...

  8. PAT甲题题解-1006. Sign In and Sign Out (25)-找最小最大

    判断哪个人最早到,哪个人最晚走水,就是找最大值最小值 #include <iostream> #include <cstdio> #include <algorithm& ...

  9. PAT甲题题解-1042. Shuffling Machine (20)-模拟

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789205.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  10. PAT甲题题解-1049. Counting Ones-数学问题

    n位数,总共有0~10^n-1共计10^n个数那么所有数出现的总次数变为n*(10^n)个数1出现的次数便是十分之一,所以n位数中,1出现的次数为n*10^(n-1)知道这一个后,接下来就方便求了. ...