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是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏 ...
随机推荐
- vue.js插件使用(01) vue-resource
本文的主要内容如下: 介绍vue-resource的特点 介绍vue-resource的基本使用方法 基于this.$http的增删查改示例 基于this.$resource的增删查改示例 基于int ...
- Silverlight读取Zip文件中的图片与视频
首先看看Demo的截图: 下面我将一步步展示实现这个Demo的过程,这个需求就是读出Zip文件中的图片与视频. Demo整体架构: 首先我们准备几张图片和视频,然后将其压缩至resource.zip文 ...
- C++ string 转 char*
string 转到 char* char name[20]; string sname=GatherName[n]; strcpy(name,sname.c_str());
- 用Python作GIS之五:从示例入手—example函数
进入STARS后,最简单的学习方法就是演示示例数据.对于源码的分析也可以从这里入手. 以下为出发菜单项“Example Project”的函数example:def example(se ...
- 基于socket的客户端和服务端聊天机器人
服务端代码如下: using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threa ...
- Android清除本地数据缓存代码案例
Android清除本地数据缓存代码案例 直接上代码: /* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除shar ...
- ios中怎么样设置drawRect方法中绘图的位置
其中drawRect方法中的参数rect就是用来设置位置的,
- squid判断文件是否修改机制分析
前提: 1.我写了一个简单的http服务器,以下简称 httpserver 2.前端使用squid做反向代理,以下简称 squid.squid同时反向代理了2台http服务器,其中一台是httpser ...
- Python运行Google App Engineer时出现的UnicodeDecodeError错误解决方案
#Python运行Google App Engineer时出现的UnicodeDecodeError错误解决方案 ##问题描述 使用Python2.7.x运行GAE时有时会报这个错误 ```py ...
- scjp考试准备 - 6 - 父类构造器的引用
题一,如下代码的执行结果: class Person{ String name = "No name"; public Person(String nm){name = nm;} ...