• bzoj 1082: [SCOI2005]栅栏


    Description

      农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材。于是农夫约翰到木材店购
    买木材。可是木材店老板说他这里只剩下少部分大规格的木板了。不过约翰可以购买这些木板,然后切割成他所需
    要的规格。而且约翰有一把神奇的锯子,用它来锯木板,不会产生任何损失,也就是说长度为10的木板可以切成长
    度为8和2的两个木板。你的任务:给你约翰所需要的木板的规格,还有木材店老板能够给出的木材的规格,求约翰
    最多能够得到多少他所需要的木板。

    解题报告

    强力剪枝搜索题哈,看到数据范围,想到搜索就是个脑洞....
    首先意识到需求的木板一定是最小的几个,所以排个序,枚举前缀....
    考虑剪枝:
    1.答案具有单调性,考虑二分或迭代,这里1000的范围选择二分
    2.强力剪枝1:答案确定了,那么所需木材总量也确定了,我们考虑用掉这些总量的木材还剩下多少,如果已经用不上的木材已经超过了最多能剩下的木材,那么一定无解了
    3.强力剪枝2:有一组数据很多相同的木材,因为同样的木材是等价的,可以视为一类,所以无先后顺序,所以可以记last去掉重复状态

    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define RG register
    #define il inline
    #define iter iterator
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    const int N=1005;
    int a[N],sum[N],n,m,tot,b[N],res,tr=0;
    bool dfs(int x,int s){
       int i,ret=0;
       if(tr>res)return false;
       if(x==0)return true;
       for(i=s;i<=m;i++){
          if(a[i]<b[x])continue;
          a[i]-=b[x];
          if(a[i]<b[1])tr+=a[i];
          if(b[x]==b[x-1])ret=dfs(x-1,i);
          else ret=dfs(x-1,1);
          if(a[i]<b[1])tr-=a[i];
          a[i]+=b[x];
          if(ret)return true;
       }
       return false;
    }
    void work()
    {
       scanf("%d",&m);
       for(int i=1;i<=m;i++)
          scanf("%d",&a[i]),tot+=a[i];
       scanf("%d",&n);
       for(int i=1;i<=n;i++)
          scanf("%d",&b[i]);
       sort(b+1,b+n+1);
       for(int i=1;i<=n;i++)
          sum[i]=sum[i-1]+b[i];
       int l=1,r=n,mid,ans=0;
       while(l<=r){
          mid=(l+r)>>1;
          res=tot-sum[mid];tr=0;
          if(dfs(mid,1))ans=mid,l=mid+1;
          else r=mid-1;
       }
       printf("%d
    ",ans);
    }
    
    int main(){work();return 0;}
    
    
  • 相关阅读:
    天文漫谈章测试题【第四章】
    天文漫谈章测试题【第三章】
    天文漫谈章测试题【第二章】
    天文漫谈-章测试题【第一章】
    天文漫谈期末考试
    《中国特色社会主义理论与实践》笔记 202001
    教育法学期末考试02MOOC
    教学法学期末考试MOOC01
    教育法学第九章单元测试MOOC
    在Linux平台上如何使用接静态库和共享库
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7650921.html
Copyright © 2020-2023  润新知