对于最优解我们发现所有的最优解都可以是前多少多少个,那么我们就二分这个前多少多少个,然后用dfs去判解,我们发现在dfs的过程中如果不剪枝几乎必T,所以我们就需要一些有效的剪枝 I. 我们在枚举过程中每个数选什么是有前后顺序的,然而对于一些相同的数他们并没有顺序我们可以记录上个数的选择点,如果两数相同,那么就从上个数的选择点开始那么时间复杂度就从次方级别降到了组合数级别,是飞跃式的 II. 然后我们发现先对于枚举顺序与选择顺序的选择是玄学的,我们可以视为他们都没影响那么我们就可利用这个了,如果我们倒着走枚举顺序那么我们可以把剩下的长度小于最小木板的木材删去,然后如果全部的减去删掉的小于需要的就退出。

对于搜索,我们有许多明显的减枝,那些都必须要减掉,然而有一些看似不起眼的小减枝在有的数据里往往会发挥很大的作用因此我们不能放弃任何一个减枝的机会。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define Max(a,b) a>b?a:b;
const int M=55;
const int N=1055;
const int K=40000;
int g[M],f[N],n,m,ans,s[N],S;
bool die[M];
inline void read(){scanf("%d",&m);for(int i=1;i<=m;i++)scanf("%d",&g[i]);scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&f[i]);std::sort(g+1,g+(m+1));std::sort(f+1,f+(n+1));while(f[n]>g[m]&&n>0)n--;int z=1,tot;while(f[1]>g[z]&&z<=m)z++;tot=m-z+1;for(int i=1,j=z;i<=tot;i++,j++)g[i]=g[j],S+=g[i];for(int i=1;i<=n;i++)s[i]=s[i-1]+f[i];m=tot;
}
bool dfs(int pos,int mid,int last,int key,int waste){if(pos==0)return true;if(waste+s[mid]>S)return false;for(int i=(f[pos]==key?last:1);i<=m;i++)if(g[i]>=f[pos]){g[i]-=f[pos];if(g[i]<f[1])waste+=g[i];if(dfs(pos-1,mid,i,f[pos],waste)){g[i]+=f[pos];return true;}if(g[i]<f[1])waste-=g[i];g[i]+=f[pos];}return false;
}
int main(){read();int l=0,r=n,mid;while(l<=r){mid=(l+r)>>1;if(dfs(mid,mid,0,0,0))ans=mid,l=mid+1;elser=mid-1;}printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/TSHugh/p/7538058.html

【BZOJ 1082】[SCOI2005]栅栏 二分+dfs相关推荐

  1. bzoj 1082: [SCOI2005]栅栏(二分+DFS)

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2373  Solved: 1007 [Submit][Stat ...

  2. BZOJ【1082】栅栏

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec Memory Limit: 162 MB Description 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些 ...

  3. BZOJ1082: [SCOI2005]栅栏

    1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1906  Solved: 816 [Submit][Statu ...

  4. [SCOI2005]栅栏(贪心+二分+dfs)难度⭐⭐⭐⭐

    [SCOI2005]栅栏(贪心+二分+dfs) P2329 [SCOI2005]栅栏 题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材. ...

  5. BZOJ-1082-[SCOI2005]栅栏(二分+dfs判定)

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

  6. BZOJ 1087: [SCOI2005]互不侵犯King

    二次联通门 : BZOJ 1087: [SCOI2005]互不侵犯King /*BZOJ 1087: [SCOI2005]互不侵犯King状压dp将每一行棋子的存在状态压成一个整数f[i][j][k] ...

  7. 51nod1307(暴力树剖/二分dfs/并查集)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...

  8. 第四届河南省程序设计大赛D nyoj306-走迷宫【二分DFS、最短路Dijkstra】

    Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * ...

  9. bzoj 1086: [SCOI2005]王室联邦(DFS)

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 2100  Solved ...

  10. BZOJ 1084: [SCOI2005]最大子矩阵【DP】

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MB Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得 ...

最新文章

  1. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
  2. 南京林业大学计算机专升本,2018江苏专转本学校之:南京林业大学
  3. 借助二分法匹配时间戳实现快速查找日志内容
  4. 产品经理如何专业吐槽产品?友谊小船从此不再翻
  5. linux中下载文件的命令
  6. HTML与CSS基础之属性选择器(二)
  7. Hibernate映射集合性能问题
  8. 小学期实践心得(2)
  9. 类型混淆漏洞实例浅析
  10. Excel用户如何学习数据分析语言DAX?
  11. JAVA面向对象编程---学生管理系统
  12. python公众号接口_python爬取微信公众号
  13. 角点(corner point)、关键点(key point)、特征点(feature point)概念辨析
  14. 有了这个 Python 库,以后再也不用写正则表达式了
  15. 从资源爬取到个人微信公众号开发:使用 Python 打造公众号电影搜索器
  16. 微信表情与输入法无缝切换(原理篇)
  17. Java中的移位操作——Java编程思想笔记
  18. 未解决:自行打包cpio格式的Ramdisk,与编译成功生成的kernel.bin,deviceTree一起打包成image.ub,不能正常启动kernel的问题???
  19. 记一次服务器被植入木马/病毒:kdevtmpfsi
  20. 芯片封装技术——Wire Bond与Flip Chip

热门文章

  1. 区间dp讲解之石子合并问题 区间dp的分析方法
  2. 【CF1333C】Eugene and an array(子区间计数)
  3. linux打开文件程序,linux – 获取打开特定文件的应用程序列表
  4. python滚动条翻页爬取数据_[Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录...
  5. 易筋SpringBoot 2.1 | 第一篇:构建第一个SpringBoot工程
  6. mysql-bin position_MySQL基于binlog-position的复制
  7. java jsonobject 清空_有没有办法,我可以清空整个JSONObject – java
  8. MDP马尔可夫决策过程
  9. 多态与虚函数(C++)
  10. vue 检测ie版本_vue 兼容低版本ie浏览器