USACO 4.1.2 栅栏的木料
这个讲的超好....一定要看...然后看我代码就好懂啦...
http://blog.csdn.net/ta201314/article/details/41287567
各种优化确实非常好....搜索的一道好题...
挂代码:
/*
Problem : USACO 4.1.2 栅栏的木料
Author : Robert Yuan 优化解释:
0. 二分+贪心判断可行解 (根据自己设计的贪心算法尽量的得到一个比较靠近正确值的 ans,再后面的搜索的下界就会大大提高)
1. 如果使用的木料与上一块的木料大小相同,那么上一块若没有选前 i块木板,这一块也不要选(1.若是因为前面的太小而不选,那么对于这个也太小 2.若是因为前面的情况已经搜过,那我选择前面的就成了一个已经搜索过的情况)
2. 如果当前需要枚举的木板与上一块木板的大小相同,只选其中最后的那块,理由同上。
3. 如果剩下的木板大小比第一块还小,那么就是属于余料,将所有余料和已经切好的木料减去,剩下的木板长度如果比未切好的 x个木料总长还要小,那么这种状态也是不可行的
*/ #include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; inline int in(){
int x=;char ch=getchar();
while(ch>'' || ch<'') ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return x;
} const int maxn=;
const int maxm=;
const int INF=0x7f7f7f7f; int n,m,S,ans;
int tmp[maxn];
int a[maxn],b[maxm],s[maxm]; bool cmp(const int &a,const int &b){
return a>b;
} bool dfs(int x,int last){
if(!x) return true;
if(S<s[x]) return false;/*优化 3*/
S-=b[x];
for(int i= x!=ans && b[x]==b[x+] ? last:/*优化 1*/;i<=n;i++){
while(i<n && a[i]==a[i+]) i++;/*优化 2*/
if(a[i]>=b[x]){
a[i]-=b[x];
if(a[i]<b[]) S-=a[i];
if(dfs(x-,i)){
if(a[i]<b[]) S+=a[i];
a[i]+=b[x]; S+=b[x];
return true;
}
if(a[i]<b[]) S+=a[i];
a[i]+=b[x];
}
}
S+=b[x];
return false;
} bool check(int m){/*优化 0*/
int Minn,Minx;
memcpy(tmp,a,sizeof(a));
for(int i=m;i;i--){
Minn=INF,Minx=-;
for(int j=;j<=n;j++)
if(tmp[j]>=b[i] && Minn>tmp[j])
Minn=tmp[j],Minx=j;
if(Minx<) return false;
tmp[Minx]-=b[i];
}
return true;
} int main(){
n=in();
for(int i=;i<=n;i++) a[i]=in(),S+=a[i];
m=in();
for(int i=;i<=m;i++) b[i]=in(); sort(a+,a+n+);
sort(b+,b+m+); for(int i=;i<=m;i++)
s[i]=s[i-]+b[i]; int l=,r=m,mid; if(check(r)){
printf("%d",m);return ;
} while(l+<r){
mid=(l+r)>>;
if(check(mid)) l=mid;
else r=mid;
}
ans=r;
while(dfs(ans,) && ans<=m) ans++;
printf("%d",ans-); return ;
}
USACO 4.1.2 栅栏的木料的更多相关文章
- codevs2777 栅栏的木料
题目描述 Description 农民John准备建一个栅栏来围住他的牧场.他已经确定了栅栏的形状,但是他在木料方面有些问题.当地的杂货储存商扔给John一些木板,而John必须从这些木板中找出尽可能 ...
- bzoj 1600 & Usaco 月赛 2008 建造栅栏 题解
[原题] 1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 785 Solved: 443 [Subm ...
- [USACO 3.3.1]骑马修栅栏t
[USACO 3.3.1]骑马修栅栏 时间限制: 1 Sec 内存限制: 64 MB提交: 39 解决: 17[提交][状态][讨论版] 题目描述 农民John每年有很多栅栏要修理.他总是骑着马穿 ...
- 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径
Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...
- USACO Section 3.3 骑马修栅栏 Riding the Fences
题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
- 【USACO 3.3.1】骑马修栅栏
[描述] Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入 ...
- 【USACO 2.4.2】穿越栅栏
[描述] 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找 ...
- USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)
Description 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程 ...
- codevs 2039 骑马修栅栏 USACO x
题目描述 Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏 ...
随机推荐
- VPN连接失败
连接VPN是总提示 本来我以为是VPN服务器的问题,可是别人就能连接成功,所以只能是我自己机子的问题.后来检查了一下连接属性,终于发现了问题: 这里“允许使用这些协议”应该是处于选中状态,而我的属性里 ...
- 新浪微博登录界面上下拉伸图片--第三方开源--PullToZoomListViewEx(二)
这是PullZoomView在ScrollView实现,Android PullZoomView在ScrollView的实现是:PullToZoomScrollViewEx 下载地址:https:// ...
- java初探native
最近碰见一个java中一个native关键字,不知道是干什么的,如下: public native String FileName(String strURL); static{ ...
- 第八章 管理类型(In .net4.5) 之 加强封装
1. 概述 本章内容包括 访问控制符.属性 和 显式接口实现. 2. 主要内容 2.1 访问控制符 封装的核心是隐藏信息.访问控制符用来实现类型成员的访问控制. C#的访问控制符有:public, i ...
- mq消息队列
rabbitmq学习9:使用spring-amqp发送消息及同步接收消息 通过对spring-amqp看重要类的认识,下面来通过spring-amqp的发送消息及同步接收消息是如何实现的.有兴趣的朋友 ...
- mybatis数据库基本配置包括数据源事物类型等
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- Android 文档之viewAnimator
一.结构 public class ViewAnimator extends FrameLayout java.lang.Object android.view.View android.view.V ...
- HTML5简略介绍
今天要说下 HTML5特有的一个元素 canvas ,旨在让web页面上作矢量图不需要在依靠flash或是其他插件,在网页上使用canvas元素时,它会创建一块矩形区域,默认300*150,当然也是可 ...
- iOS 七大手势之轻拍,长按,旋转手势识别器方法
一.监听触摸事件的做法 如果想监听一个view上面的触摸事件,之前的做法通常是:先自定义一个view,然后再实现view的touches方法,在方法内部实现具体处理代码 通过touches方法监听 ...
- 通过WebBrowser取得AJAX后的网页
通常情况下通过WebBrowser的文档加载完成事件DocumentCompleted中进行判断 if (_WebBrowder.ReadyState == WebBrowserReadyState. ...