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. ...
随机推荐
- SpringBoot | 第十六章:web应用开发
前言 前面讲了这么多直接,都没有涉及到前端web和后端交互的部分.因为作者所在公司是采用前后端分离方式进行web项目开发了.所以都是后端提供api接口,前端根据api文档或者服务自行调用的.后台也有读 ...
- ASP.NET MVC CheckBoxFor为什么会生成hidden input控件
自己开发的公众号,可以领取淘宝内部优惠券 @Html.CheckBoxFor(m => m.Bool) 使用CheckBoxFor方法得到的html代码会是下面这个样子 <input ch ...
- sql优化经典例子
场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIMARY KEY, name varchar(10) ) 数据10 ...
- vs2010 opencv2.4.10 配置过程出现的问题 & mfc打开图片
配置参考网址: http://blog.csdn.net/zy122121cs/article/details/49180541 无法启动程序,系统找不到指定的文件:原因是程序编译有错误(不是路径之类 ...
- linux 命令——55 traceroute(转)
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一 ...
- app再次进入数据不加载问题
问题原因:触发点击事件在加载页面之前完成. 1.调整了一下页面加载顺序 2.增加了settime的时间
- echarts 相关属性介绍
title: {//图表标题 x: 'left', //组件离容器左侧的距离,left的值可以是像20,这样的具体像素值, 可以是像 '20%' 这样相对于容器高宽的百分比,也可以是 'lef ...
- 如果CDN服务器出了问题,怎么做不影响自己的网站
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3.jquery.min.js"></ ...
- IOS UIView动画(封装动画)
● UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView 将为这些改变提供动画支持 ● 执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视 图, ...
- Codeforces Round #327 590B Chip 'n Dale Rescue Rangers(等效转换,二分)
t和可到达具有单调性,二分就不多说了.下面说下O(1)的做法,实际上是等效转换,因为答案一定存在,如果在t0之前,那么分解一下 直接按照只有v计算就可以了.反过来如果计算的结果大于t0,那么表示答案在 ...