题目传送

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

找维度/搜索面临状态/对象:当前体积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. 根据select的option文本选中对应的选项

    function selectByOptionTxt(obj,txt){ var optionArr = $(obj).find("option"); for(var i=0;i& ...

  2. /etc/syscofig/network 修改主机名

    [root@mysql ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=mysql

  3. java中时间与时间戳的相互转换

    package com.test.one; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...

  4. 小白用Mac

    老话说的好,“最近老板发我一个Mac,但是不会用,嘎嘎嘎嘎” 1.安装软件 安装 Homebrew Homebrew:使用 Homebrew 安装 Apple 没有预装但 你需要的东西,尤其是非界面管 ...

  5. Oracle SQL调优

    在多数情况下,Oracle使用索引t来更快地遍历表,优化器主要根据定义的索引来提高性能. 但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种 ...

  6. CentOS 7安装Python 2.6(与已有版本共存)

    1. 安装需要用到的包 yum install -y zlib-devel bzip2-devel openssl-devel xz-libs wget 2. 下载 Python 2.6.8 版本 w ...

  7. 前端导出excel文件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Hibernate-Criteria学习笔记

    hibernate_jpa注解 目前最新版的hibernate,5.2,底层整合了jpa,用idea的hibernate工具生成实体时,实体包含了注解的配置文件,缺一不可 如,用户类实体,生成之后是这 ...

  9. 目标检测(三) Fast R-CNN

    引言 之前学习了 R-CNN 和 SPPNet,这里做一下回顾和补充. 问题 R-CNN 需要对输入进行resize变换,在对大量 ROI 进行特征提取时,需要进行卷积计算,而且由于 ROI 存在重复 ...

  10. ES6 系列之异步处理实战

    前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator -> Async 异步处理方式的改变. API 介绍 为了实现这个功能,我 ...