题目传送

显然是道深搜题。由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积。

找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]。

可行性剪枝考虑/找限制、上下界:

   1、考虑当前:当前体积v一定小于总体积N;第i层的半径和高度一定比上一层小(从下往上数层数),同时每次层的高度和半径都>=1(都是正整数)。

   2、更近一步,考虑未来:预处理出蛋糕制作到第i层之后再制作的蛋糕体积最小的情况,如果当前体积+这种情况>N,显然不能做成蛋糕;顶层的h、r要大于等于一,而下面每层都要比上面的大,所以h[i]、r[i]>=m-i+1

最优性剪枝考虑:

   1、考虑当前:当前面积s小于已搜到的答案ans(否则不会更有,回溯)。

   2、更近一步,考虑未来:预处理出蛋糕制作到第i层之后再制作的蛋糕面积最小的情况,如果当前面积积+这种情况>=ans,显然不会更优,回溯。

联系各个维度加强剪枝(简单粗暴的概括:尝试各维度/状态互相表示、将各自的边界融合在一起):

   1(可行性):由N-v>=πr2h ,r>=1,h>=1得r<=sqrt(N-v),h<=(N-v)/r/r(因为最后的Q把π“全包了”,所以可以无视π)(先枚举r,再枚举h)

     2(最优性):利用h与r数组,dep+1到m层的体积可以表示成n-v=∑(k=dep+1,m)h[k]*r[k]*r[k],表面积(不算底面积,因为s先前已经算上了)可以表示成2∑(k=dep+1,m)h[k]*r[k]。因为2∑(k=dep+1,m)h[k]*r[k]=2/r[dep]*∑(k=dep+1,m)h[k]*r[k]*r[dep]>=2/r[dep]*∑(k=dep+1,m)h[k]*r[k]*r[k]=2*(n-v)/r[dep], 所以当s+2*(n-v)/r[dep]>=ans时就回溯。

考虑搜索顺序:为了使搜索树较浅的地方分支少,可从底层向顶层搜索。

上AC注释代码:

 #include<iostream>
#include<cstdio>
#include<cmath> using namespace std; int n,m,r[],h[],minv[],mins[];//层数从下往上数 ,mins仅为侧面积
int s,v,ans=0x7fffffff;//目前面积、体积,最终答案 void dfs(int k)//要干第k层
{
for(int i=min(r[k-]-,(int)sqrt(n-v));i>=m-k+;i--)//半径r (融合多种剪枝)
for(int j=min(h[k-]-,(int)((n-v)/(double)i/i));j>=m-k+;j--)//高度h (融合多种剪枝)
{
if(v+minv[k]>n||s+mins[k]+r[]*r[]>=ans||*(n-v)/(double)r[k-]+s+r[]*r[]>=ans) return;//可行性&最优性剪枝
v+=i*i*j;
s+=*i*j;
r[k]=i;
h[k]=j;
if(k!=m&&v!=n) dfs(k+);
if(k==m&&v==n) ans=min(ans,s+r[]*r[]);
v-=i*i*j;
s-=*i*j;
}
} int main()
{
cin>>n>>m;
r[]=0x7fffffff;h[]=0x7fffffff;
for(int i=m;i>=;i--)//预处理
{
minv[i]=minv[i+]+(m-i+)*(m-i+);
mins[i]=mins[i+]+(m-i+)*;
}
dfs();
if(ans==0x7fffffff) ans=;//没有解输出0
cout<<ans;
return ;
}

小总结:仔细分析性质、找状态维度、分析边界、确认好搜索顺序。

一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>的更多相关文章

  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. poj1190 生日蛋糕(深搜+剪枝)

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

  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. N皇后问题 深搜+剪枝 hdu-2553

    N 皇后问题在此就不多介绍了,相信CS的同学都应经清楚了,不清楚也可自行Google(听说国内用不了Google了?令人发指!).在此以一道例题为引. hdu-2553 1 #include < ...

随机推荐

  1. 4.站点克隆wget----隐写术图片----backbox linux

    站点克隆wget sudo bash cd Desktop/Cloned wget -h clear wget -mk https://help.ubuntu.com/ 隐写术图片 想想朋友圈的图片 ...

  2. docker安装tomcat&部署javaweb程序

    一.docker定制简单的java-web应用镜像 网址: 1.jdk下载网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk ...

  3. .net core 学习小结之环境配置篇

    安装IIs对 netcore 的支持 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/aspnet-core-mod ...

  4. java程序启动脚本

    #!/bin/bash appName=`ls|grep .jar$` if [ -z $appName ] then echo "Please check that this script ...

  5. c++ 多线程(2000个)端口扫描(附源码)

    目录 程序适应环境与基本介绍 程序适应环境与基本介绍 情况:开2000个线程,扫描主机上开启的端口,扫描时间40秒左右. 瓶颈:不管开5000还是更多,都不能大幅加快扫描时间. 瓶颈解决方法:可以使用 ...

  6. tensorflow学习笔记二----------变量

    tensorflow里面的变量表示,需要使用特定的语法进行.如果想构造一个行(列)向量,需要调用Variable函数进行.对两个变量进行操作,也要调用相应的函数. import tensorflow ...

  7. Composer学习

    Composer简介 Composer是PHP的一个依赖管理工具,不是包管理器:在项目中声明所依赖的外部工具库(libraries),Composer会自动安装止血工具库及依赖的库文件. 安装方式 C ...

  8. localStorage的使用和vuex的拆分

    问题1:在隐身模式.或者用户未启用的情况下,使用localStorage可能会导致浏览器直接报错,怎么办? 方法:使用try-catch包裹 代码示例: store.jsimport Vue from ...

  9. pandas 常规操作大全

    那年夏天抓住了蝉的尾巴 gitbook 前言 pandas 抓住 Series (排序的字典), DataFrame (row + 多个 Series) 对象 , 就如同 numpy 里抓住 ndar ...

  10. 自定义UICollectionLayout

    #import "AppDelegate.h"#import "CircleLayout.h"#import "CollectionViewDataS ...