这道题目我们使用深搜加剪枝的方法来写,我们首先算出一个最小表面积和最小体积来,就是半径从一递增,高度也从一递增,这是题目要求。

然后我们计算出一个底层最大的半径和最大的高度,我们就从这个最大半径和最大高度开始深度优先搜索,每一层的蛋糕都从最大半径开始深搜,然后内循环里面同样是对应每一层不同半径不同高度的深搜,所以就是双重循环进行搜索。

但是在搜索之前我们要进行剪枝,第一个剪枝是在边界条件里面,如果层数等于零了,但是v还不等与零,我们就直接返回,如果体积等于零了说明此方案可行,然后把它和最小表面积进行比较并赋值。

或者层数还不等于零,但是此时的体积已经小于零了,我们也直接返回。

其余的剪枝都是在for循环里面进行的,我们首先进行最优性剪枝,并且预测一下如果之前的表面积加上这层的表面积再加上之后最小的层数对应的表面积,如果此时大于了已经求得的最优表面积,我们就直接返回。

与此对应的可行性剪枝就是,如果总体积减去之前的体积,减去这层的体积,再减去之后层数的最小体积小于零的话,我们也直接返回。

如果,这层的最大半径减去层数加一小于零了,或最大高度减去层数加一小于零了,我们也直接返回,因为每层的半径和高度都要大于上一层,所以最小的公差就是一,如果最宽泛的这个顶层范围都无法满足的时候,我们就不必再搜了。

最后一个剪枝就是假设之后的每一层蛋糕都按照最大的半径和高度建造,如果这时的体积依旧要小于我们要建的体积,我们也直接返回了。

因为这个深搜的范围很宽,而且题目当中的时间限制是一秒,所以我们剪枝剪得精细一些才能过。

代码如下:

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int N,M;
int minArea=1<<30;
int area=0;
int minV[25];//k层及之上的蛋糕最小总体积
int minA[25];//k层及之上的蛋糕的最小表面积 void Dfs(int v,int n,int max_r,int max_h)
{
if (n==0) {
if (v!=0) {
return ;
}
else {
minArea=min(minArea,area);
return ;
}
}
if (v<0)
return ;
for (int r=max_r;r>=n;r--) {
if (n==M)
area=r*r;
for (int h=max_h;h>=n;h--) {
if (area+2*r*h>=minArea)
continue;
if (v-r*r*h-minV[n-1]<0)
continue;
if (max_r-n+1<=0||max_h-n+1<=0)
return ;
int sum=0;
for (int i=n-1;i>=0;i--) {
sum+=(r-i)*(r-i)*(h-i);
}
if (sum<v)
continue;
area+=2*r*h;
Dfs(v-r*r*h,n-1,r-1,h-1);
area-=2*r*h;
}
}
} int main()
{
cin>>N>>M;
int maxH,maxR;
memset(minV,0,sizeof(minV));
memset(minA,0,sizeof(minA));
for (int i=1;i<=20;i++) {
minA[i]=2*i*i+minA[i-1];
}//侧面积累加
for (int i=1;i<=20;i++) {
minV[i]=minV[i-1]+i*i*i;//最小体积累加
minA[i]+=i*i;//最小表面积累加
}
maxR=sqrt(N-minV[M-1]);
maxH=N-minV[M-1];
Dfs(N,M,maxR,maxH);
if (minArea==1<<30)
cout<<0<<endl;
else
cout<<minArea<<endl;
return 0;
}

POJ-1190 蛋糕问题的更多相关文章

  1. poj 1190 DFS 不等式放缩进行剪枝

    F - (例题)不等式放缩 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submi ...

  2. POJ 1190(深搜)

    http://poj.org/problem?id=1190 又有好久没做搜索的题了,没想到做一个卡了我那么久,想哭啊. 一个中文题,思路呢也就是搜索呗,一层一层往上面搜,不过这里有两个比较重要的地方 ...

  3. POJ 1190 生日蛋糕 【DFS + 极限剪枝】

    题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...

  4. 生日蛋糕 POJ - 1190 搜索 数学

    http://poj.org/problem?id=1190 题解:四个剪枝. #define _CRT_SECURE_NO_WARNINGS #include<cstring> #inc ...

  5. 洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕

    题目传送门(洛谷)  OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态 ...

  6. POJ 1190 生日蛋糕题解

    题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...

  7. poj 1190 生日蛋糕

    中文题 题目分析 搜索题,非常好的剪枝 由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第1层,……,最底层的蛋糕为第m层,很明显满足题目条件的前i层的(从顶层(也就是编号 ...

  8. POJ 1190 生日蛋糕(DFS)

    生日蛋糕 Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit Status Descrip ...

  9. 生日蛋糕 POJ - 1190 (搜索+剪枝)

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...

  10. 生日蛋糕 POJ - 1190

    7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当 ...

随机推荐

  1. Android Studio提示忽略大小写

    Android Studio的自动提示功能非常之强大,但是,如果你要输入“String”,你输入“string”,这个是不会提示的,也就是大小写敏感的,不爽是吗? 选择大小写不敏感就ok了!这样你想怎 ...

  2. bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1122  Solved: 80 ...

  3. Apache-kylin-2.0.0-bin-hbase1x.tar.gz的下载与安装(图文详解)

    首先,对于Apache Kylin的安装,我有话要说. 由于Apache Kylin本身只是一个Server,所以安装部署还是比较简单的.但是它的前提要求是Hadoop.Hive.HBase必须已经安 ...

  4. python之yaml模块和ddt模块

    aml文件是专门用来写配置文件的语言,非常简洁和强大,远比json格式方便. 在PC中新建一个yml/yaml为为缩略名的文件,输入信息见下图 新建一个py文件处理yml文件,直接处理成字典格式 缩进 ...

  5. One hundred layer HDU - 4374

    One hundred layer HDU - 4374 $sum[i][j][k]$表示第i层第j到k列的和 $ans[i][j]$表示第i层最终停留在第j列的最大值,那么显然$ans[i][j]= ...

  6. magento 自定义url路径 和 filter data 小结

    背景是往一个第三方的搜索插件里面加入filter功能. 首先是路径,插件自己定义了一个router,类似于cms.那首先说说router好了,从入口一路追查的话,会发现最后进入的是Mage_Core_ ...

  7. python_13(前端—cs)

    第1章 前端三大标准:1.1 三大标准介绍 1.2 html标签一览表 第2章 结构标准 html 2.1 html结构 2.2 html常用标签 2.2.1 h1-h6 2.2.2 span 2.2 ...

  8. Hadoop体系结构管理

    一.查看Zookeeper信息 [hadoop@weekend01 ~]$zkServer.sh status JMX enabled by default Using config: /hadoop ...

  9. Linux下用matplotlib画决策树

    1.trees = {'no surfacing': { 0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}} 2.从我的文件trees.txt里读的决策树, ...

  10. 前端之CSS语法及选择器

    一.css语法: css由两大部分组成:选择符和声明,声明由属性和属性值两部分组成; 选择符{属性:属性值;属性:属性值;} 注: a) 属性和属性值之间用冒号连接: b)每条声明结束要加分号: 二. ...