首页 > 其他 > 详细

[bzoj1082]栅栏

时间:2019-11-05 09:14:05      阅读:67      评论:0      收藏:0      [点我收藏+]

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

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,a[105],b[1005];
 4 bool dfs(int k,int s){
 5     if (s<0)return 0;
 6     if (!k)return 1;
 7     for(int i=1;i<=n;i++)
 8         if (a[i]>=b[k]){
 9             a[i]-=b[k];
10             if (dfs(k-1,s-a[i]*(a[i]<b[1]))){
11                 a[i]+=b[k];
12                 return 1;
13             }
14             a[i]+=b[k];
15         }
16     return 0;
17 }
18 int main(){
19     scanf("%d",&n);
20     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
21     scanf("%d",&m);
22     for(int i=1;i<=m;i++)scanf("%d",&b[i]);
23     sort(a+1,a+n+1);
24     sort(b+1,b+m+1);
25     int l=0,r=m;
26     while (l<r){
27         int mid=(l+r+1>>1),s=0;
28         for(int i=1;i<=n;i++)s+=a[i];
29         for(int i=1;a[i]<b[1];i++)s-=a[i];
30         for(int i=1;i<=mid;i++)s-=b[i];
31         if (dfs(mid,s))l=mid;
32         else r=mid-1;
33     }
34     printf("%d",l);
35 }
View Code

 

[bzoj1082]栅栏

原文:https://www.cnblogs.com/PYWBKTDA/p/11796140.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!