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. ...
随机推荐
- Validation failed for one or more entities. See ‘EntityValidationErrors’,一个或多个验证错误 解决方法
try{// 写数据库}catch (DbEntityValidationException dbEx){ }在 dbEx 里面中我们就可以看到
- 50道CSS基础面试题(附答案)
1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽度 ...
- Check Point R80 Security Management
平台: CentOS 类型: 虚拟机镜像 软件包: Security Management basic software security 服务优惠价: 按服务商许可协议 云服务器费用:查看费用 立即 ...
- Team Foundation 版本控制
与 Visual Studio 的一流集成. 使用富文件和文件夹差异工具突出显示代码更改. 借助强大的可视化跨分支跟踪代码更改. 集成的代码评审工具有助于在签入代码之前获得反馈. 使用托管版本或本地版 ...
- IOS CALayer基本使用 (图层)
● 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层(CALayer) ● 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView 的l ...
- POJ 1703 Find them, Catch them(并查集,等价关系)
DisjointSet保存的是等价关系,对于某个人X,设置两个变量Xa,Xb.Xa表示X属于a帮派,Xb类似. 如果X和Y不是同一个帮派,那么Xa -> Yb,Yb -> Xa... (X ...
- hdu1863 畅通工程---MST&连通
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1863 题目大意: 中文题,求MST权值,如果不连通,输出? 解题思路: 这道题帮我找出了之前模板中的 ...
- Android(java)学习笔记154:采用HttpClient提交数据(qq登录案例)
1.Apache -Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包 ...
- C语言异常处理编程的三个境界
http://blog.csdn.net/treefish2012/article/details/17466487 这是上一次看完Herb Sutter的<Exceptional C++> ...
- 【BZOJ4196】[NOI2015] 软件包管理器(树链剖分)
点此看题面 大致题意: 有\(n\)个软件包,它们的依赖关系形成一棵树.现在,问你安装或卸载一个软件包,会影响多少个软件包的安装状态. 树链剖分 这道题应该是 树链剖分 算法比较入门的题目吧. 对于安 ...