1. 题目链接:poj1190 生日蛋糕
  1. 解题思路:
  1. 深搜,枚举:每一层可能的高度和半径
  1. 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度
  1. 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到小试
  1. 剪枝:
  1. ①已建好的面积已经超过目前求得的最优表面积,或者预见到搭完后面积一定会超过目前最优表面积,则停止搭建(最优性剪枝)
  1. ②预见到再往上搭,高度已经无法安排,或者半径无法安排,则停止搭建(可行性剪枝)
  1. ③还没搭的那些层的体积,一定会超过还缺的体积,则停止搭建(可行性剪枝)
  1. ④还没搭的那些层的体积,最大也到不了还缺的体积,则停止搭建(可行性剪枝)
  1.  
  1. 看讨论时看见了一个神剪枝:当2 * leftVolume / r + currentS >= min停止搜索
  2. currentS代表“已有的圆柱的侧面积之和+最底下圆柱的横截面面积”。min代表已得到的最小表面积。
  3. 假设只有一个圆柱,该圆柱的半径为r,体积为leftVolume,可知:2 * leftVolume/r 表示圆柱的侧面积。
  4. 现在我们有2个圆柱,要求这两个圆柱叠在一起之后满足题目的条件:下柱半径>上柱半径。把上柱压扁,压到和下柱的半径相等,那么根据表面积和体积公式,我们知道上柱的侧面积会减小。
  5. 多个圆柱叠立,假设最下面圆柱半径最大,该半径为r。于是,这些圆柱的侧面积之和>=等体积的半径为r的圆柱的侧面积。
  6. 假设还有k层柱要搜索,leftVolume是剩余体积,r是第k层的圆柱的最大可能半径。那么2*leftVolume/r<=k层圆柱的最小侧面积之和。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define CLR(a,b) memset((a),(b),sizeof(a))
  7. using namespace std;
  8.  
  9. const int inf = 0x3f3f3f3f;
  10. int ans; //最优表面积
  11. int area; //正在搭建中的蛋糕的表面积
  12. int N, M;//体积N,层数M
  13. int minv[]; //第i层蛋糕最少的体积
  14. int mins[]; //第i层蛋糕的最少侧表面积
  15.  
  16. int maxV(int n, int r, int h){
  17. //在n层蛋糕,底层最大半径r,最高高度h的情况下,能凑出来的最大体积
  18. int v = ;
  19. for(int i = ; i < n; ++i)
  20. v += (r - i) * (r - i) * (h - i);
  21. return v;
  22. }
  23. void dfs(int v, int n, int r, int h){
  24. //用n层去凑体积v,最底层半径最大为r, 高度最大为 h
  25. //求出最小表面积放入ans
  26. if(n == ){
  27. if(v == && area < ans){
  28. ans = area;
  29. return;
  30. }
  31. }
  32. if(v <= ) return;
  33.  
  34. if((*v*./r+area)>=ans) return;
  35. if(area + mins[n] >= ans ) return;
  36. if(h < n || r < n) return;
  37. if(v < minv[n]) return;
  38. if(maxV(n, r, h) < v) return;
  39. for(int rr = r ; rr >= n; --rr){//从大到小搜索!
  40. if(n == M) //底面积(总的上表面积)
  41. area = rr * rr;
  42. for(int hh = n; hh <= h; ++hh){
  43. area += * rr * hh;
  44. dfs(v - rr*rr*hh, n-, rr-, hh-);
  45. area -= * rr * hh;
  46. }
  47. }
  48. }
  49. int main(){
  50. int i, j;
  51. int maxh;//底层最大高度
  52. int maxr;//底层最大半径
  53. scanf("%d %d", &N, &M);
  54.  
  55. CLR(minv, ); CLR(mins, );
  56.  
  57. for(i = ; i <= M; ++i){
  58. //第i层半径至少为i,,高度至少为i
  59. minv[i] = minv[i - ] + i * i * i;
  60. mins[i] = mins[i - ] + * i * i;
  61. }
  62. if(minv[M] > N){
  63. printf("0\n"); return ;
  64. }
  65. area = ;
  66. ans = inf;
  67. //底层体积不超过(n - minv[m - 1])
  68. maxh = (N - minv[M - ]) / (M * M) + ; //底层半径至少为 m
  69. maxr = sqrt(.*(N - minv[M-]) / M) + ;//底层高度至少为 m
  70.  
  71. dfs(N, M, maxr, maxh);
  72.  
  73. if(ans == inf) printf("0\n");
  74. else printf("%d\n", ans);
  75. return ;
  76. }
  1.  
  1.  

poj1190 生日蛋糕(深搜+剪枝)的更多相关文章

  1. Hdu3812-Sea Sky(深搜+剪枝)

    Sea and Sky are the most favorite things of iSea, even when he was a small child.  Suzi once wrote: ...

  2. 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  3. UVA 10160 Servicing Stations(深搜 + 剪枝)

    Problem D: Servicing stations A company offers personal computers for sale in N towns (3 <= N < ...

  4. ACM 海贼王之伟大航路(深搜剪枝)

    "我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...

  5. hdu 1518 Square(深搜+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518 题目大意:根据题目所给的几条边,来判断是否能构成正方形,一个很好的深搜应用,注意剪枝,以防超时! ...

  6. POJ-1724 深搜剪枝

    这道题目如果数据很小的话.我们通过这个dfs就可以完成深搜: void dfs(int s) { if (s==N) { minLen=min(minLen,totalLen); return ; } ...

  7. 模拟赛T5 : domino ——深搜+剪枝+位运算优化

    这道题涉及的知识点有点多... 所以还是比较有意思的. domino 描述 迈克生日那天收到一张 N*N 的表格(1 ≤ N ≤ 2000),每个格子里有一个非 负整数(整数范围 0~1000),迈克 ...

  8. POJ2044 深搜+剪枝(云彩下雨)

    题意:        有一个城镇,是4*4的大小的,然后你控制一块云彩,2*2的,你每天可以有9种走的方法,上下左右,或者不动,走的时候可以走1或者2步,云彩所在的地方肯定会下雨,然后给你做多365天 ...

  9. HDU 1175 连连看 (深搜+剪枝)

    题目链接 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以 ...

随机推荐

  1. STL--map

    map--概述: 映射(Map)和多重映射(Multimap)是基于某一类型Key的键集的存在,提供对TYPE类型的数据进行快速和高效的检索. l对Map而言,键只是指存储在容器中的某一成员. lMu ...

  2. FLASH CC 2015 CANVAS (一) 与AS3的写法区别

    注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 AS3 JS stop() this.stop(); mc.stop() this.mc.stop( ...

  3. 转 Cocos网络篇[3.2](3) ——Socket连接(1)

    Cocos网络篇[3.2](3) ——Socket连接(1) 2015-03-05 22:24:13 标签:network http socket cocos [唠叨] 在客户端游戏开发中,使用HTT ...

  4. html textarea 获取换行

    1.需求: 获取textarea中的换行符,存到数据库中,并在取出时显示出换行操作 2.实践 2.1 发现可以取到换行符 "/n" ,并且可以存储到MySQL数据库中,并不需要特殊 ...

  5. 08 高效的SQL

    编写高效 SQL 需要以下知识 有关所查询内容的物理组织的知识 数据库能做什么的知识, 例如: 如果你不知道跳跃扫描索引及其用途, 那么你可能会看着模式说”索引丢了” SQL 所有错综复杂的知识 对目 ...

  6. Gas Station

    Description: There are N gas stations along a circular route, where the amount of gas at station i i ...

  7. Maven——Maven核心概念

    原文:http://www.cnblogs.com/xdp-gacl/p/4051819.html 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1. ...

  8. [Hibernate] - EAGER and LAZY

    Hibernate中的字段映射中的Fetch有两种方式:EAGER和LAZY Eager:全部抓取 Lazy:延迟抓取 如果在字段中声明为Eager,那么在取得当前Bean时,同时会抓取Bean中的关 ...

  9. 工作流学习——Activiti流程定义管理三步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...

  10. 使用 Velocity 模板引擎快速生成代码(zhuan)

    http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/ ****************************************** ...