这个讲的超好....一定要看...然后看我代码就好懂啦...

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 栅栏的木料的更多相关文章

  1. codevs2777 栅栏的木料

    题目描述 Description 农民John准备建一个栅栏来围住他的牧场.他已经确定了栅栏的形状,但是他在木料方面有些问题.当地的杂货储存商扔给John一些木板,而John必须从这些木板中找出尽可能 ...

  2. bzoj 1600 &amp; Usaco 月赛 2008 建造栅栏 题解

    [原题] 1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 785  Solved: 443 [Subm ...

  3. [USACO 3.3.1]骑马修栅栏t

    [USACO 3.3.1]骑马修栅栏 时间限制: 1 Sec  内存限制: 64 MB提交: 39  解决: 17[提交][状态][讨论版] 题目描述 农民John每年有很多栅栏要修理.他总是骑着马穿 ...

  4. 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径

    Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...

  5. USACO Section 3.3 骑马修栅栏 Riding the Fences

    题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...

  6. 【USACO 3.3.1】骑马修栅栏

    [描述] Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入 ...

  7. 【USACO 2.4.2】穿越栅栏

    [描述] 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找 ...

  8. USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)

    Description 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程 ...

  9. codevs 2039 骑马修栅栏 USACO x

    题目描述 Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏 ...

随机推荐

  1. jquery 基础汇总---导图篇

    最近在慕课网学习了一些jquery的基础知识,为了方便记忆,整理出来的导图 jQuery基础总共分为4个部分,分别是样式篇.事件篇.动画篇.DOM篇. 样式篇,主要介绍jQuery的基础语法,选择器以 ...

  2. MongoDB简述

    简介 MongoDB is an open-source document database that provides high performance, high availability, an ...

  3. Mysql常用数据类型详细说明及实例说明(学习笔记一)

    1.Mysql 在windows下 Net start mysql[启动] Net stop mysql[停止] Quit[退出mysql命令行] \c[取消输入的命令] Select version ...

  4. ArrayAdapter的简单使用

    1.创建一个类继承ArrayAdapter private class MyAdapter extends ArrayAdapter { LayoutInflater in; Context cont ...

  5. GoogleMapApi 发布后提示安全问题

    今天日本那边发过来一个Bug说是Google Map打不开,提示安全问题. 最后发现,日本那边的发布路径如下: https:xxxxx.gspserver.co.jp 而Source中Google M ...

  6. DataGridView的DataGridViewCheckBox问题

    datagridview有一列DataGridViewCheckBox,但连续点击的话(1秒点击N次),会导致出错,数据处理不正确,感觉 private void dgv_CellContentCli ...

  7. C扩展 从共享内存shm到memcache外部内存

    引言 - ipc - shm 共享内存 本文会通过案例了解ipc 的共享内存机制使用, 后面会讲解C 如何使用外部内存服务memcached. 好先开始了解 linux 共享内存机制. 推荐先参看下面 ...

  8. WIFI 物理组件

    物理组件参考:http://book.51cto.com/art/201404/435813.htm SDIO总线参考:此总线sd卡连接也有关系.(http://www.linuxidc.com/Li ...

  9. hdu 3074 Multiply game

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3074 Minimum Inversion Number Description Tired of pl ...

  10. df du

    df命令详细用法 a:显示全部的档案系统和各分割区的磁盘使用情形 i:显示i -nodes的使用量 k:大小用k来表示 (默认值) t:显示某一个档案系统的所有分割区磁盘使用量 x:显示不是某一个档案 ...