DFS:POJ1190-生日蛋糕(基础搜索)
生日蛋糕
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 19800 | Accepted: 7023 |
描述
7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。
设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i < M时,要求Ri > Ri+1且Hi > Hi+1。
由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。
令Q = Sπ
请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。
(除Q外,以上所有数据皆为正整数)
输入
有两行,第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M <= 20),表示蛋糕的层数为M。
输出
仅一行,是一个正整数S(若无解则S = 0)。
样例输入
100
2
样例输出
68
Hint
体积V = πR2H
侧面积A' = 2πRH
底面积A = πR2
解题心得:
1、之前还以为搜索做的不错了,结果看到这个搜索题就直接蒙了。一开始并没有往搜索这个方向去想,还以为是数学问题,题目的后面还给了遗串公式。后来知道是搜索题的时候还是不太好下手,但是题目给了一个很明确的范围那就是整数范围之内,这样就大大的缩减了范围。
2、就本题来说,它只能深度搜索,遍历每一种情况比较得出最小的面积,它的到最终答案的边界在层数刚好用完于此同时体积也刚好用完。看起来很恐怖,但这道题的精髓就在剪枝,剪枝将这个很恐怖的搜索变得很简单也很快捷。
3、三个剪枝:第一,体积超出或者层数超出可以减去,当前面积大于已经得到的最小面积可以减去。第二,当前剩下的面积加上当前已经得到的面积可以直接减去(在循环中)。第三,剩余层数乘以当前体积小于剩下的体积可以减去(也就是体积用不完了)。三个剪枝之中只有能够想到任意两个都可以过。其实也不是完全想不到,题目给出的条件就体积,层数,面积的限制,剪枝也完全实在这些方面去想,还是完全有可能能够想得到的。
4、做了这个题之后感触很深,其实一些看似完全没有办法的题还是都有迹可循的,就这个题来说,数学方面不可能用公式直接得出答案,也只能够遍历,既然遍历,bfs好像并不是很好弄,那就只能dfs,dfs超时,没办法只能够剪枝,剪枝也只能从面积,体积,层数上面着手,仔细想一下其中的关系,找出相互限制的边界就可以很完美的剪枝。特别是这个题说明了只能是整数,在一个特定的点才能得到答案也是一种做题方向的启示。对题没反应那就只能多做了,做有质量的题,没见过的题才有长进。
#include<stdio.h>
int ans = 0;
int N,M;
void dfs(int m,int left_v,int last_r,int last_h,int sum_s)
{
if(!left_v && !m)
{
if(ans && sum_s < ans)
ans = sum_s;
else if(ans == 0)
ans = sum_s;
return ;
}
if(m*(last_h-1)*(last_r-1)*(last_r-1) < left_v && m != M)//当前的体积加上未用层数的体积大于给定体积(体积用不完)
return ;
if(m<=0 || left_v<=0 || (sum_s >= ans && ans))//非正常情况
return ;
for(int i=last_r-1;i>=m;i--)
{
for(int j=last_h-1;j>=m;j--)
{
int v = i*i*j;
int s = 2*i*j;
if(m == M)
s += i*i;
if(2*left_v/i + sum_s >= ans && ans)//当前面积和加上剩余的面积大于已经得出的最小面积
continue;
dfs(m-1,left_v-v,i,j,sum_s+s);
}
}
}
int main()
{
scanf("%d%d",&N,&M);
dfs(M,N,100,1000,0);
printf("%d\n",ans);
}
DFS:POJ1190-生日蛋糕(基础搜索)的更多相关文章
- poj1190 生日蛋糕(深搜+剪枝)
题目链接:poj1190 生日蛋糕 解题思路: 深搜,枚举:每一层可能的高度和半径 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到 ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- poj 1088 动态规划+dfs(记忆化搜索)
滑雪 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Description Mi ...
- poj1190 生日蛋糕 dfs
题意:生日蛋糕有m层,总体积是V.从下向上,每一层的半径r和高度h都是递减的. 给m.v,求最小的表面积s.(不算底面接地的面积) 题目链接:poj1190 剪枝都还没加..样例输出都是错的...还没 ...
- POJ1190生日蛋糕[DFS 剪枝]
生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18236 Accepted: 6497 Description ...
- [POJ1190]生日蛋糕<DFS>
题目链接:http://poj.org/problem?id=1190 题看上去确实很复杂 涉及到半径面积这些,其实看着真的很头疼 但是除去这些就是剪枝优化的dfs算法 #include<cst ...
- poj1190生日蛋糕
生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12277 Accepted: 4325 Description 7月1 ...
- [NOI1999]生日蛋糕(搜索)
[NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半 ...
- Clone Graph leetcode java(DFS and BFS 基础)
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
随机推荐
- 本地添加Maven管理
Maven下载安装: 1 .Maven下载地址:http://maven.apache.org/ 2 .下载解压到本地指定目录:记住该路径! 3 .新建/修改环境变量-系统变量: 名:M2_HOME ...
- html标签补充
<body>内常用标签 1.<div>和<span> <div></div> : <div>只是一个块级元素,并无实际的意义.主 ...
- es6-Iterator与for...of
Iterator(遍历器)的概念 JavaScript原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6又添加了Map和Set.这样就有了四种数据集合,用户还可以组合 ...
- 在Ubuntu环境下配置NIMH MEG Core Facility之CTF Tools
在Ubuntu环境下配置NIMH MEG Core Facility之CTF Tools 网站有提示: The install script won't work, but you can copy ...
- Jscript 命名规范
变量命名都以类型前缀+有意义的单词组成,用驼峰式命名法增加变量和函式的可读性.例如:sUserName,nCount. 前缀规范:每个局部变量都需要有一个类型前缀,按照类型可以分为:s:表示字符串.例 ...
- 使用Loadrunner监控Windows资源
为了区分把装有loadrunner的机器称作A,被监控资源的服务器(windows)称作B 1.确保B机器Administrator账户是可使用状态:右键计算机→ 管理→ 本地用户和组→ 用户,其中A ...
- c++ vector & 二维数组 & MessageBox
vector: https://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html c++ 二维数组: int **p; p = new in ...
- 小记:iOS 中一般对于 view 不依赖 model 的的两种代码书写形式
一. 前言 对于在 MVC 的定义中,view 层是不引用 model 层,view 和 model 是不相往来的 一般开发中,我们都写过 在自定义 view 中增加一个 model 的属性,外接直接 ...
- SPOJ - MATSUM Matrix Summation---二维树状数组
题目链接: https://vjudge.net/problem/SPOJ-MATSUM 题目大意: 二维数组,两种操作 SET 将某点设置成x SUM 求某个区域之和 解题思路: 这里用二维树状数组 ...
- 【BZOJ1030】[JSOI2007] 文本生成器(AC自动机上跑DP)
点此看题面 大致题意: 给你\(N\)个字符串(只含大写字母),要你求出有多少个由\(M\)个大写字母构成的字符串含有这\(N\)个字符串中的至少一个. \(AC\)自动机 看到题目,应该比较容易想到 ...