显然我们取的肯定是前ans块木板。然后砍的木材也应该是从小到大砍(如果小的木材可以满足条件,就一定不会去动大的木材)

所以两遍排序。

二分答案。

然后对于要取的每块木板,我们搜索它是在第x块木板上砍下来的。。

要加剪枝:

①如果砍下了这块木材然后这块木材小于第一块木板,那就失去价值,用t来记录。当t>tot-s[now],(tot是记录的所有给的木板长度),那么退出。

②如果b[now]==b[now-1]那么从当前点开始枚举就可以了,因为前面小的点都被跳过了

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<cmath>
  7. using namespace std;
  8.  
  9. #define N 60
  10. #define M 1010
  11.  
  12. int n,m;
  13. int tot,mid;
  14. int t;
  15.  
  16. int a[N],b[M],c[N];
  17. int s[M];
  18.  
  19. bool DFS(int now,int d)
  20. {
  21. if (!now)
  22. return true;
  23. if (t>tot-s[mid])
  24. return false;
  25. for (int i=d;i<=m;i++)
  26. if (c[i]>=b[now])
  27. {
  28. c[i]-=b[now];
  29. if (c[i]<b[1])
  30. t+=c[i];
  31. if (b[now]==b[now-1])
  32. {
  33. if (DFS(now-1,i))
  34. return true;
  35. }
  36. else
  37. {
  38. if (DFS(now-1,1))
  39. return true;
  40. }
  41. if (c[i]<b[1])
  42. t-=c[i];
  43. c[i]+=b[now];
  44. }
  45. return false;
  46. }
  47.  
  48. int work(int mid)
  49. {
  50. for (int i=1;i<=m;i++)
  51. c[i]=a[i];
  52. t=0;
  53. return DFS(mid,1);
  54. }
  55.  
  56. int main()
  57. {
  58. scanf("%d",&m);
  59. for (int i=1;i<=m;i++)
  60. scanf("%d",&a[i]),tot+=a[i];
  61. scanf("%d",&n);
  62. for (int i=1;i<=n;i++)
  63. scanf("%d",&b[i]);
  64. sort(a+1,a+m+1);
  65. sort(b+1,b+n+1);
  66. for (int i=1;i<=n;i++)
  67. s[i]=s[i-1]+b[i];
  68. while (s[n]>tot)
  69. n--;
  70. int l=0,r=n;
  71. while (l<r)
  72. {
  73. mid=(l+r)>>1;
  74. if (work(mid+1))
  75. l=mid+1;
  76. else
  77. r=mid;
  78. }
  79. printf("%d\n",l);
  80. return 0;
  81. }

  

【bzoj1082】栅栏[SCOI2005]的更多相关文章

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

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

  2. 【bzoj1082】 SCOI2005—栅栏

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

  3. 洛谷P2329 栅栏 [SCOI2005] 搜索

    正解:搜索 解题报告: 先放下传送门! 首先说下爆搜趴,就直接枚每个需求是否被满足以及如果满足切哪个板子,随便加个最优性剪枝,似乎是有80pts 然后思考优化 首先显然尽量满足需求比较小的,显然如果能 ...

  4. [bzoj1082]栅栏

    先二分答案,然后搜索暴力判断由于数据范围较大,需要剪枝:1.当前所有可能被用到的木板长度和(长度要不小于最小所需长度)>=所要拼成的所有木板的和:2.对于需求从大到小枚举木板(这样一开始枚举次数 ...

  5. BZOJ第一页刷题计划

    BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...

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

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

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

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

  8. bzoj1082[SCOI2005]栅栏

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

  9. 【BZOJ1082】【SCOI2005】栅栏

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

随机推荐

  1. canvas一周一练 -- canvas绘制中国银行标志(4)

    运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...

  2. Django基础核心技术之Model模型的介绍与设计

    Django基础核心技术之Model模型的介绍与设计原创: Yunbo Shi Python Web与Django开发 2018-05-03Django网络应用开发的5项基础核心技术包括模型(Mode ...

  3. netstat查看服务器连接数端口并发数

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...

  4. Python isalpha() 方法检测字符串是否只由字母组成。

    Python isalpha() 方法检测字符串是否只由字母组成.

  5. A4. JVM 内存分配及回收策略

    [概述] Java 技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的 Ed ...

  6. 整理推荐比较好用的具有书签搜索功能的chrome插件

    平时在整理学习chrome插件的过程中,经常会去试用各种大家推荐的插件.在去年我们的一篇文章:推荐六款好用的书签收藏夹剪藏型管理插件.这里面介绍的是收藏书签的插件.而随着我们使用chrome越来越频繁 ...

  7. LINUX-光盘

    cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 mkisofs /dev/cdrom > ...

  8. Codeforces Round #235 (Div. 2)

    A. Vanya and Cards time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  9. hdu 5040bfs+优先队列 需要存状态

    /* 剪枝:四秒后状态会变得和原来一样,所以四秒后如果再经过这个点肯定不是最优的舍去 易错点:在一个是从.到.这两个点都没有被照到并且不是摄像机,也可能需要等3秒,因为后面的结果可能再这三秒中发生改变 ...

  10. Holedox Eating HDU4302 模拟

    Problem Description Holedox is a small animal which can be considered as one point. It lives in a st ...