bzoj 1082: [SCOI2005]栅栏【二分+dfs】
2018-09-28 20:46
344 查看
二分答案,dfs判断是否可行,当b[k]==b[k-1]时可以剪枝也就是后移枚举位置
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1005; int n,a ,m,b ,sum,s ,re,mid,t ; bool dfs(int k,int x) { if(k<=0) return 1; if(s[mid]+re>sum) return 0; for(int i=x;i<=m;i++) if(t[i]>=b[k]) { t[i]-=b[k]; if(t[i]<b[1]) re+=t[i]; if(b[k]==b[k-1]) { if(dfs(k-1,i)) return 1; } else if(dfs(k-1,1)) return 1; if(t[i]<b[1]) re-=t[i]; t[i]+=b[k]; } return 0; } int main() { scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%d",&a[i]),sum+=a[i]; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&b[i]); sort(a+1,a+1+m); sort(b+1,b+1+n); for(int i=1;i<=n;i++) s[i]=s[i-1]+b[i]; while(b >a[m]) n--; int l=0,r=n,ans=0; while(l<=r) { mid=(l+r)>>1; re=0; for(int i=1;i<=n;i++) t[i]=a[i]; if(dfs(mid,1)) l=mid+1,ans=mid; else r=mid-1; } printf("%d\n",ans); return 0; }
相关文章推荐
- 【BZOJ 1082】[SCOI2005]栅栏 二分+dfs
- bzoj 1082: [SCOI2005]栅栏(二分+DFS)
- [BZOJ 1082] [SCOI2005] 栅栏 【二分 + DFS验证(有效剪枝)】
- [bzoj1082][SCOI2005]栅栏(二分+dfs剪枝)
- BZOJ 1082: [SCOI2005]栅栏 DFS,剪枝,二分答案
- 【BZOJ】1082: [SCOI2005]栅栏(二分+dfs)
- BZOJ 1082 [SCOI2005]栅栏 二分+DFS
- bzoj 1082: [SCOI2005]栅栏 (二分+dfs)
- 【bzoj1082】 SCOI2005 栅栏 二分+搜索
- BZOJ 1082: [SCOI2005]栅栏|二分答案爆搜
- [BZOJ1082][SCOI2005]栅栏 二分+搜索减枝
- 1082: [SCOI2005]栅栏 二分+dfs+剪枝
- 【bzoj 1082】栅栏(二分+DFS)
- BZOJ1082: [SCOI2005]栅栏
- [BZOJ1082][SCOI2005]栅栏
- [BZOJ1082][SCOI2005]栅栏
- [bzoj] 1082: [SCOI2005]栅栏
- bzoj1082: [SCOI2005]栅栏
- bzoj 1082: [SCOI2005]栅栏
- bzoj1082 [SCOI2005]栅栏