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是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏 ...
随机推荐
- 转载字典地址:http://blog.csdn.net/aladdinty/article/details/3591789
相关文章: http://www.360doc.com/content/13/1003/23/14070959_318861279.shtml http://www.360doc.com/conten ...
- DevExpress XtraGrid 数据导出导入Excel
// <summary> /// 导出按钮 /// </summary> /// <param name="sender"></param ...
- How to get Financial Dimension Value from Worker Position[AX2012]
To get financial dimension value from worker position, add a new method in hcmWorker Table with scri ...
- python Django 学习笔记(四)—— 使用MySQL数据库
1,下载安装MySQLdb类库 http://www.djangoproject.com/r/python-mysql/ 2,修改settings.py 配置数据属性 DATABASES = { 'd ...
- rails bug
variable @fontAwesomeEotPath_iefix is undefined rails generate bootstrap:install如果还有错,保证在加载主提之前impor ...
- Ajax-goahead局部刷新页面
软件开发最常用的方法是:C/S,B/S.如果嵌入式设备中使用Ajax,那么既可以使用C/S方式,也可以使用B/S开发上位机.最近公司的一个项目需要异步获取后台数据,使用form更新数据时会有空白卡顿不 ...
- mysql外键设置(待测试)
外键的定义语法:[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) REFERENCES tbl_name (index_col ...
- zip解压缩
package com.green.project.compress; import java.io.File;import java.io.FileInputStream;import java.i ...
- JQUERY 判断选择器选择的对象 是否存在
判断方法: 直接选择判断,是不正确的方法,因为 $(“#id”) 不管对象是否存在都会返回 object . if($("#id")){ alert('存在'); }else{ a ...
- Redbean:入门(二) - Find
<?php require_once 'rb.php'; $tableName = 'link'; //连接数据库 R::setup('mysql:host=localhost;dbname=h ...