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

http://blog.csdn.net/ta201314/article/details/41287567

各种优化确实非常好....搜索的一道好题...

挂代码:

  1. /*
  2. Problem : USACO 4.1.2 栅栏的木料
  3. Author : Robert Yuan
  4.  
  5. 优化解释:
  6. 0. 二分+贪心判断可行解 (根据自己设计的贪心算法尽量的得到一个比较靠近正确值的 ans,再后面的搜索的下界就会大大提高)
  7. 1. 如果使用的木料与上一块的木料大小相同,那么上一块若没有选前 i块木板,这一块也不要选(1.若是因为前面的太小而不选,那么对于这个也太小 2.若是因为前面的情况已经搜过,那我选择前面的就成了一个已经搜索过的情况)
  8. 2. 如果当前需要枚举的木板与上一块木板的大小相同,只选其中最后的那块,理由同上。
  9. 3. 如果剩下的木板大小比第一块还小,那么就是属于余料,将所有余料和已经切好的木料减去,剩下的木板长度如果比未切好的 x个木料总长还要小,那么这种状态也是不可行的
  10. */
  11.  
  12. #include<cstdio>
  13. #include<cstring>
  14. #include<algorithm>
  15.  
  16. using namespace std;
  17.  
  18. inline int in(){
  19. int x=;char ch=getchar();
  20. while(ch>'' || ch<'') ch=getchar();
  21. while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
  22. return x;
  23. }
  24.  
  25. const int maxn=;
  26. const int maxm=;
  27. const int INF=0x7f7f7f7f;
  28.  
  29. int n,m,S,ans;
  30. int tmp[maxn];
  31. int a[maxn],b[maxm],s[maxm];
  32.  
  33. bool cmp(const int &a,const int &b){
  34. return a>b;
  35. }
  36.  
  37. bool dfs(int x,int last){
  38. if(!x) return true;
  39. if(S<s[x]) return false;/*优化 3*/
  40. S-=b[x];
  41. for(int i= x!=ans && b[x]==b[x+] ? last:/*优化 1*/;i<=n;i++){
  42. while(i<n && a[i]==a[i+]) i++;/*优化 2*/
  43. if(a[i]>=b[x]){
  44. a[i]-=b[x];
  45. if(a[i]<b[]) S-=a[i];
  46. if(dfs(x-,i)){
  47. if(a[i]<b[]) S+=a[i];
  48. a[i]+=b[x]; S+=b[x];
  49. return true;
  50. }
  51. if(a[i]<b[]) S+=a[i];
  52. a[i]+=b[x];
  53. }
  54. }
  55. S+=b[x];
  56. return false;
  57. }
  58.  
  59. bool check(int m){/*优化 0*/
  60. int Minn,Minx;
  61. memcpy(tmp,a,sizeof(a));
  62. for(int i=m;i;i--){
  63. Minn=INF,Minx=-;
  64. for(int j=;j<=n;j++)
  65. if(tmp[j]>=b[i] && Minn>tmp[j])
  66. Minn=tmp[j],Minx=j;
  67. if(Minx<) return false;
  68. tmp[Minx]-=b[i];
  69. }
  70. return true;
  71. }
  72.  
  73. int main(){
  74. n=in();
  75. for(int i=;i<=n;i++) a[i]=in(),S+=a[i];
  76. m=in();
  77. for(int i=;i<=m;i++) b[i]=in();
  78.  
  79. sort(a+,a+n+);
  80. sort(b+,b+m+);
  81.  
  82. for(int i=;i<=m;i++)
  83. s[i]=s[i-]+b[i];
  84.  
  85. int l=,r=m,mid;
  86.  
  87. if(check(r)){
  88. printf("%d",m);return ;
  89. }
  90.  
  91. while(l+<r){
  92. mid=(l+r)>>;
  93. if(check(mid)) l=mid;
  94. else r=mid;
  95. }
  96. ans=r;
  97. while(dfs(ans,) && ans<=m) ans++;
  98. printf("%d",ans-);
  99.  
  100. return ;
  101. }

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. silverlight 获取路径 config

    1.获取web.config配置内容: web.config default.aspx protected string InitParams { get; set; } InitParams = s ...

  2. linux shell 逻辑运算符、逻辑表达式

    shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决很多复杂的判断. 一.逻辑运算符  逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 e ...

  3. Dll学习二_Dll 窗体中动态创建数据并使用Demo

    沿用上一篇Demo 环境:DelphiXE,XP,SQL2005 贴出改动过的单元代码: dbGrid控件版: unit SubMain_Unit; interface uses Windows, M ...

  4. 成为JAVA GC专家系列

    http://www.360doc.com/content/13/0305/10/15643_269387617.shtmlhttp://www.360doc.com/content/13/0305/ ...

  5. STM32F0xx_SPI读写(Flash)配置详细过程

    Ⅰ.概述 关于SPI(Serial Peripheral Interface)串行外设接口可以说是单片机或者嵌入式软件开发人员必须掌握的一项通信方式,就是你在面试相关工作的时候都可能会问及这个问题.在 ...

  6. c语言结构体保存并输出学生信息

    最近在学习数据结构,巩固下c语言. #include<stdio.h> /*定义结构体student并设置别名stud*/ /*typedef struct student{ int nu ...

  7. 切换两个activity

    下面是一个切换两个activity是过度动画效果实例:(注意里面的overridePendingTransition()方法)Java代码 1. @Override public void onCre ...

  8. ssh 安装

    一 ssh 1.查看ssh服务的状态 输入以下命令: sudo service sshd status 如果出现 Loaded: error (Reason: No such file or dire ...

  9. mac os x 系统安装 genymotion android 模拟器

    如果你有 apk 文件 想 运行一下看看 ,但是又没有  android 设备 ,那么 genymotion 将会是一个  很好的解决方案. 1.安装 下载链接: https://cloud.geny ...

  10. Window7上搭建symfony开发环境(PEAR)

    http://blog.csdn.net/kunshan_shenbin/article/details/7162243 1. 更新PEAR 进入PHP所在目录,找到go-pear.bat并双击. 一 ...