bzoj 1082: [SCOI2005]栅栏
2017-10-11 15:39
246 查看
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 ,sum ,n,m,tot,b ,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\n",ans); } int main(){work();return 0;}
相关文章推荐
- BZOJ 1082 SCOI 2005 栅栏 搜索+剪枝
- BZOJ1082: [SCOI2005]栅栏
- bzoj1082[SCOI2005]栅栏
- bzoj1082[SCOI2005]栅栏
- [BZOJ1082][SCOI2005]栅栏
- bzoj1082: [SCOI2005]栅栏
- [bzoj1082][SCOI2005]栅栏(二分+dfs剪枝)
- [BZOJ1082][SCOI2005]栅栏 二分+搜索减枝
- [bzoj] 1082: [SCOI2005]栅栏
- bzoj 1082: [SCOI2005]栅栏【二分+dfs】
- BZOJ1082: [SCOI2005]栅栏 题解
- [BZOJ1082][SCOI2005]栅栏
- bzoj 1082: [SCOI2005]栅栏(二分+DFS)
- 【BZOJ】1082: [SCOI2005]栅栏(二分+dfs)
- bzoj 1082 [SCOI2005]栅栏 搜索姿势不对毁一生
- 【bzoj1082】[SCOI2005]栅栏
- [BZOJ 1082] [SCOI2005] 栅栏 【二分 + DFS验证(有效剪枝)】
- bzoj 1082: [SCOI2005]栅栏 (二分+dfs)
- bzoj1082: [SCOI2005]栅栏
- BZOJ1082: [SCOI2005]栅栏