poj1190 生日蛋糕(深搜+剪枝)
- 题目链接:poj1190 生日蛋糕
- 解题思路:
- 深搜,枚举:每一层可能的高度和半径
- 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度
- 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到小试
- 剪枝:
- ①已建好的面积已经超过目前求得的最优表面积,或者预见到搭完后面积一定会超过目前最优表面积,则停止搭建(最优性剪枝)
- ②预见到再往上搭,高度已经无法安排,或者半径无法安排,则停止搭建(可行性剪枝)
- ③还没搭的那些层的体积,一定会超过还缺的体积,则停止搭建(可行性剪枝)
- ④还没搭的那些层的体积,最大也到不了还缺的体积,则停止搭建(可行性剪枝)
- 看讨论时看见了一个神剪枝:当2 * leftVolume / r + currentS >= min停止搜索
- currentS代表“已有的圆柱的侧面积之和+最底下圆柱的横截面面积”。min代表已得到的最小表面积。
- 假设只有一个圆柱,该圆柱的半径为r,体积为leftVolume,可知:2 * leftVolume/r 表示圆柱的侧面积。
- 现在我们有2个圆柱,要求这两个圆柱叠在一起之后满足题目的条件:下柱半径>上柱半径。把上柱压扁,压到和下柱的半径相等,那么根据表面积和体积公式,我们知道上柱的侧面积会减小。
- 多个圆柱叠立,假设最下面圆柱半径最大,该半径为r。于是,这些圆柱的侧面积之和>=等体积的半径为r的圆柱的侧面积。
- 假设还有k层柱要搜索,leftVolume是剩余体积,r是第k层的圆柱的最大可能半径。那么2*leftVolume/r<=k层圆柱的最小侧面积之和。
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #define CLR(a,b) memset((a),(b),sizeof(a))
- using namespace std;
- const int inf = 0x3f3f3f3f;
- int ans; //最优表面积
- int area; //正在搭建中的蛋糕的表面积
- int N, M;//体积N,层数M
- int minv[]; //第i层蛋糕最少的体积
- int mins[]; //第i层蛋糕的最少侧表面积
- int maxV(int n, int r, int h){
- //在n层蛋糕,底层最大半径r,最高高度h的情况下,能凑出来的最大体积
- int v = ;
- for(int i = ; i < n; ++i)
- v += (r - i) * (r - i) * (h - i);
- return v;
- }
- void dfs(int v, int n, int r, int h){
- //用n层去凑体积v,最底层半径最大为r, 高度最大为 h
- //求出最小表面积放入ans
- if(n == ){
- if(v == && area < ans){
- ans = area;
- return;
- }
- }
- if(v <= ) return;
- if((*v*./r+area)>=ans) return;
- if(area + mins[n] >= ans ) return;
- if(h < n || r < n) return;
- if(v < minv[n]) return;
- if(maxV(n, r, h) < v) return;
- for(int rr = r ; rr >= n; --rr){//从大到小搜索!
- if(n == M) //底面积(总的上表面积)
- area = rr * rr;
- for(int hh = n; hh <= h; ++hh){
- area += * rr * hh;
- dfs(v - rr*rr*hh, n-, rr-, hh-);
- area -= * rr * hh;
- }
- }
- }
- int main(){
- int i, j;
- int maxh;//底层最大高度
- int maxr;//底层最大半径
- scanf("%d %d", &N, &M);
- CLR(minv, ); CLR(mins, );
- for(i = ; i <= M; ++i){
- //第i层半径至少为i,,高度至少为i
- minv[i] = minv[i - ] + i * i * i;
- mins[i] = mins[i - ] + * i * i;
- }
- if(minv[M] > N){
- printf("0\n"); return ;
- }
- area = ;
- ans = inf;
- //底层体积不超过(n - minv[m - 1])
- maxh = (N - minv[M - ]) / (M * M) + ; //底层半径至少为 m
- maxr = sqrt(.*(N - minv[M-]) / M) + ;//底层高度至少为 m
- dfs(N, M, maxr, maxh);
- if(ans == inf) printf("0\n");
- else printf("%d\n", ans);
- return ;
- }
poj1190 生日蛋糕(深搜+剪枝)的更多相关文章
- Hdu3812-Sea Sky(深搜+剪枝)
Sea and Sky are the most favorite things of iSea, even when he was a small child. Suzi once wrote: ...
- 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>
题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...
- UVA 10160 Servicing Stations(深搜 + 剪枝)
Problem D: Servicing stations A company offers personal computers for sale in N towns (3 <= N < ...
- ACM 海贼王之伟大航路(深搜剪枝)
"我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...
- hdu 1518 Square(深搜+剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518 题目大意:根据题目所给的几条边,来判断是否能构成正方形,一个很好的深搜应用,注意剪枝,以防超时! ...
- POJ-1724 深搜剪枝
这道题目如果数据很小的话.我们通过这个dfs就可以完成深搜: void dfs(int s) { if (s==N) { minLen=min(minLen,totalLen); return ; } ...
- 模拟赛T5 : domino ——深搜+剪枝+位运算优化
这道题涉及的知识点有点多... 所以还是比较有意思的. domino 描述 迈克生日那天收到一张 N*N 的表格(1 ≤ N ≤ 2000),每个格子里有一个非 负整数(整数范围 0~1000),迈克 ...
- POJ2044 深搜+剪枝(云彩下雨)
题意: 有一个城镇,是4*4的大小的,然后你控制一块云彩,2*2的,你每天可以有9种走的方法,上下左右,或者不动,走的时候可以走1或者2步,云彩所在的地方肯定会下雨,然后给你做多365天 ...
- HDU 1175 连连看 (深搜+剪枝)
题目链接 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以 ...
随机推荐
- STL--map
map--概述: 映射(Map)和多重映射(Multimap)是基于某一类型Key的键集的存在,提供对TYPE类型的数据进行快速和高效的检索. l对Map而言,键只是指存储在容器中的某一成员. lMu ...
- FLASH CC 2015 CANVAS (一) 与AS3的写法区别
注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 AS3 JS stop() this.stop(); mc.stop() this.mc.stop( ...
- 转 Cocos网络篇[3.2](3) ——Socket连接(1)
Cocos网络篇[3.2](3) ——Socket连接(1) 2015-03-05 22:24:13 标签:network http socket cocos [唠叨] 在客户端游戏开发中,使用HTT ...
- html textarea 获取换行
1.需求: 获取textarea中的换行符,存到数据库中,并在取出时显示出换行操作 2.实践 2.1 发现可以取到换行符 "/n" ,并且可以存储到MySQL数据库中,并不需要特殊 ...
- 08 高效的SQL
编写高效 SQL 需要以下知识 有关所查询内容的物理组织的知识 数据库能做什么的知识, 例如: 如果你不知道跳跃扫描索引及其用途, 那么你可能会看着模式说”索引丢了” SQL 所有错综复杂的知识 对目 ...
- Gas Station
Description: There are N gas stations along a circular route, where the amount of gas at station i i ...
- Maven——Maven核心概念
原文:http://www.cnblogs.com/xdp-gacl/p/4051819.html 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1. ...
- [Hibernate] - EAGER and LAZY
Hibernate中的字段映射中的Fetch有两种方式:EAGER和LAZY Eager:全部抓取 Lazy:延迟抓取 如果在字段中声明为Eager,那么在取得当前Bean时,同时会抓取Bean中的关 ...
- 工作流学习——Activiti流程定义管理三步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...
- 使用 Velocity 模板引擎快速生成代码(zhuan)
http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/ ****************************************** ...