题目链接:

这个题目非常好,有难度;能够好好的多做做;

  1. #include<iostream>
  2. #include<string>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<queue>
  6. #include<map>
  7. #include<cmath>
  8. #include<stack>
  9. #include<set>
  10. #include<vector>
  11. #include<algorithm>
  12. #define LL long long
  13. using namespace std;
  14. int MinArea=1<<30; // 存最优表面积。
  15. int MinV[30]; // 存第一层到该层最小体积;
  16. int MinA[30]; // 存第一层到该层最小面积。
  17. int N,M; // 体积,层数。
  18. int area=0; // 存增在搭建的表面积;
  19. int MaxV(int n,int r,int h) // 当有n层时。能够有的最大体积;当中r为最大半径,h为最大高度;
  20. {
  21. int v=0;
  22. for(int i=0;i<n;i++) v+=(r-i)*(r-i)*(h-i);
  23. return v;
  24. }
  25. void dfs(int v,int n,int r,int h)
  26. {
  27. if(n==0){ // 说明一种情况搭建层数已经完毕。
  28. if(v) return;
  29. else{
  30. MinArea=min(MinArea,area); // 能够搭建,则更新最优解。
  31. return;
  32. }
  33. }
  34. if(v<=0) return; // 体积不够,退出。
  35. if(MinV[n]>v) return; // 搭建n层的最小体积比提供的体积大。即无法搭建。退出;
  36. if(area+MinA[n]>=MinArea) return; // 当前搭建表面积加上前n层最小的表面积比最优解更大。则能够退出。
  37. if(h<n||r<n) return; // 最大半径,或者最大高度比层数还要多。则就说明已经无法继续搭建了。
  38. if(MaxV(n,r,h)<v) return; // 这n层能够搭建的最大体积都比提供的体积要小,说明无法按要求搭建;
  39. for(int rr=r;rr>=n;rr--){ // 从最大半径開始枚举搜索。
  40. if(n==M) area=rr*rr; // 底面积;
  41. for(int hh=h;hh>=n;hh--){ // 从最大高度開始枚举。
  42. area+=2*rr*hh; // 搭建的面积更新;
  43. dfs(v-rr*rr*hh,n-1,rr-1,hh-1);
  44. area-=2*rr*hh; // 回溯;
  45. }
  46. }
  47. }
  48. int main()
  49. {
  50. while(~scanf("%d%d",&N,&M)){
  51. MinV[0]=0;
  52. MinA[0]=0;
  53. for(int i=1;i<=M;i++){
  54. MinV[i]=MinV[i-1]+i*i*i; // 前i层最小体积;
  55. MinA[i]=MinA[i-1]+2*i*i; // 前i层最小面积;
  56. }
  57. if(MinV[M]>N) printf("0\n");
  58. else{
  59. int MaxH=(N-MinV[M-1])/(M*M)+1; // 底层最大高度。
  60. int MaxR=sqrt(double(N-MinV[M-1])/M)+1; // 底层最大半径;
  61. int area=0;
  62. MinArea=1<<30;
  63. dfs(N,M,MaxH,MaxR);
  64. if(MinArea==1<<30) printf("0\n");
  65. else printf("%d\n",MinArea);
  66. }
  67. }
  68. return 0;
  69. }

POJ-1190-生日蛋糕-DFS(深搜)-枚举-多重剪枝的更多相关文章

  1. POJ - 1190 生日蛋糕 dfs+剪枝

    思路:说一下最重要的剪枝,如果当前已经使用了v的体积,为了让剩下的表面积最小,最好的办法就是让R尽量大,因为V = πR 2H,A' = 2πRH,A' = V / R * 2 ,最大的R一定是取当前 ...

  2. POJ 2676 数独+dfs深搜

    数独 #include "cstdio" #include "cstring" #include "cstdlib" #include &q ...

  3. DFS 深搜专题 入门典例 -- 凌宸1642

    DFS 深搜专题 入门典例 -- 凌宸1642 深度优先搜索 是一种 枚举所有完整路径以遍历所有情况的搜索方法 ,使用 递归 可以很好的实现 深度优先搜索. 1 最大价值 题目描述 ​ 有 n 件物品 ...

  4. CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】

    [编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色 ...

  5. poj 2386:Lake Counting(简单DFS深搜)

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18201   Accepted: 9192 De ...

  6. poj1190 生日蛋糕(深搜+剪枝)

    题目链接:poj1190 生日蛋糕 解题思路: 深搜,枚举:每一层可能的高度和半径 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到 ...

  7. 【DFS深搜初步】HDOJ-2952 Counting Sheep、NYOJ-27 水池数目

    [题目链接:HDOJ-2952] Counting Sheep Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  8. USACO 2.3.3 Zero Sum 和为零(深搜枚举)

    Description 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将 ...

  9. Codevs 1710 == POJ 1190 生日蛋糕 == 洛谷P1731

    生日蛋糕 时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ ...

随机推荐

  1. c#中dynamic ExpandoObject的用法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. SQLServer存储引擎——06.索引的遍历与维护

    一.遍历 索引树的每个节点都是一个页面. 索引树有三种类型的节点:根节点.中间节点.叶子节点. (1) 根节点与中间节点一样,只包含下一层节点的入口值与入口指针,它们称为索引节点: (2) 叶子节点包 ...

  3. 【转】 [UnityUI]UGUI射线检测

    http://blog.csdn.net/lyh916/article/details/50947026 1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂 ...

  4. sql server 韩文查询匹配失败

    在SQL Server 中查询韩文信息时,没有匹配到对应的信息,检查程序后发现字段类型是nvarchar类型的没有问题, 打开存储过程后找到问题了:原来是拼接后的查询语句存储在一个varchar变量中 ...

  5. Jerasure 1.2A 中的 C 函数 tips

    C stat函数的用法举例 C语言 fread()与fwrite()函数说明与示例 /  C 库函数 - fwrite() C 库函数 - sprintf()

  6. Redis+sentinel 高可用实践

    1.环境规划 10.213.50.138(主) redis+sentinel 10.213.50.168(从) redis+sentinel 10.213.50.227  作为客户端测试插入数 2.r ...

  7. react-router路由参数

    react-router会自动为路由组件插入三个参数,但是不会主动为路由组件的子组件注入 子组件当中需要在属性当中传入 不是路由组件需要注入路由参数的话,也可以使用withRouter注入,而不是从属 ...

  8. 【HDOJ5556】Land of Farms(最大团)

    题意:给定n*m的网格图,上面只有字符'.' 和 数字0-9.其中数字表示这是该格是古老的土地,字符'.'表示该格只是普通的土地. 可以认为一块古老的农田由四联通的所有数字相同的格组成的块,一块普通的 ...

  9. 页面get post等查看

    原文发布时间为:2010-03-08 -- 来源于本人的百度文章 [由搬家工具导入] http://www.fiddler2.com/Fiddler2/firstrun.asp

  10. 调用Outlook发送邮件

    #region 查找与指定文件关联在一起的程序的文件名 /// <summary> /// 查找与指定文件关联在一起的程序的文件名 /// </summary> /// < ...