题目传送

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

找维度/搜索面临状态/对象:当前体积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. 【Linux开发】Ubuntu图形界面切换与磁盘扩展分区

    Ubuntu14.04设置字符界面快捷键:ctrl-alt-f1 切换回图形界面:ctrl-alt-f7 为虚拟机拓展了30G的空间,挂在了/mnt/sda3这个目录下: 说明一下Ubuntu14.0 ...

  2. mybatis中resultMap的使用

    在mybatis中,使用<select>标签,必须要设置resultType属性 或 resultMap属性 否则会报错! resultType一般是返回简单类型的查询结果,涉及一张表 可 ...

  3. urllib库认证,代理,cookie

    认证,代理,cookie 1from urllib.request import HTTPBasicAuthHandler, HTTPPasswordMgrWithDefaultRealm, buil ...

  4. mysql中的范式

    范式 范式:Normal Format,是一种离散数学中的知识,是为了解决数据的存储与优化的问题:保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余.范 ...

  5. JS事件绑定的两种形式

    第一种: obj.on*=function(){} var btn=document.getElementById('myBtn'); btn.onclick=function(){ alert(1) ...

  6. centos6配置本地yum源

    在无法访问外网时,yum安装软件会失败,这时候可以配置yum源为本地的镜像iso来解决这个问题 1. 使用Xftp上传iso镜像文件到服务器 2. 使用如下命令新建挂载点并挂载 sudo mkdir ...

  7. [CQOI2014]数三角形 题解(组合数学+容斥)

    [CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...

  8. CSS 毛玻璃效果

    效果图: <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <met ...

  9. 6-1 如何读写csv数据

    >>> from urllib import urlretrieve >>> urlretrieve('http://table.finance.yahoo.com ...

  10. jquery TAB切换小插件

    //tab切换 ;(function($, window, document, undefined) { $.fn.tab = function(options) { var defaults = { ...