题目链接: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 生日蛋糕(深搜+剪枝)的更多相关文章

  1. Hdu3812-Sea Sky(深搜+剪枝)

    Sea and Sky are the most favorite things of iSea, even when he was a small child.  Suzi once wrote: ...

  2. 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  3. UVA 10160 Servicing Stations(深搜 + 剪枝)

    Problem D: Servicing stations A company offers personal computers for sale in N towns (3 <= N < ...

  4. ACM 海贼王之伟大航路(深搜剪枝)

    "我是要成为海贼王的男人!" 路飞他们伟大航路行程的起点是罗格镇,终点是拉夫德鲁(那里藏匿着"唯一的大秘宝"--ONE PIECE).而航程中间,则是各式各样的 ...

  5. hdu 1518 Square(深搜+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518 题目大意:根据题目所给的几条边,来判断是否能构成正方形,一个很好的深搜应用,注意剪枝,以防超时! ...

  6. POJ-1724 深搜剪枝

    这道题目如果数据很小的话.我们通过这个dfs就可以完成深搜: void dfs(int s) { if (s==N) { minLen=min(minLen,totalLen); return ; } ...

  7. 模拟赛T5 : domino ——深搜+剪枝+位运算优化

    这道题涉及的知识点有点多... 所以还是比较有意思的. domino 描述 迈克生日那天收到一张 N*N 的表格(1 ≤ N ≤ 2000),每个格子里有一个非 负整数(整数范围 0~1000),迈克 ...

  8. POJ2044 深搜+剪枝(云彩下雨)

    题意:        有一个城镇,是4*4的大小的,然后你控制一块云彩,2*2的,你每天可以有9种走的方法,上下左右,或者不动,走的时候可以走1或者2步,云彩所在的地方肯定会下雨,然后给你做多365天 ...

  9. HDU 1175 连连看 (深搜+剪枝)

    题目链接 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以 ...

随机推荐

  1. python 内建函数功能函数 abs() coerce() divmod() round() pow()

    >>> abs(-1)1>>> abs(10.)  10.0>>> abs(1.2-2.1j)2.4186773244895647>> ...

  2. Qt修改xml文件

    <taskpackage styleId="styles/2dc70235-e48b-4e11-b074-3c3f773ae1f3" id="3333" ...

  3. [SAP ABAP开发技术总结]Form(subroutine)、Function参数传值传址

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. python_way day10 python和其他语言的作用域 、 python2.7多继承和3.5多继承的区别 、 socket 和 socketserver源码(支持并发处理socket,多进程,多线程)

    python_way day10 1.python的作用域和其他语言的作用域 2.python2.7多继承和3.5多继承的区别 3.socket和socketserver源码(并发处理socket) ...

  5. Codeforces Round #288 (Div. 2) C. Anya and Ghosts 模拟

    C. Anya and Ghosts time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. Moq的使用

    参考资料: 1. http://www.codeproject.com/Tips/729646/TDD-using-MOQ 2. https://github.com/Moq/moq4/wiki/Qu ...

  7. DB层面上的设计 分库分表 读写分离 集群化 负载均衡

    第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的 互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的 ...

  8. Android获取窗体信息的Util方法

    package com.wangyi.tools; import android.app.Activity; import android.util.DisplayMetrics; public cl ...

  9. 使用Maven构建Web项目

    现自己在重新操作一下:(使用的是Eclipse JavaEE版 ps:eclipse-jee-indigo-SR1-win32,已经安装好了m2eclipse插件) 1.新建Maven项目 1.1 F ...

  10. 关于Spring定时任务(定时器)用法

    Spring定时任务的几种实现 Spring定时任务的几种实现 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): 从作业类的继承方式来讲,可以分为两类: 从任务调度的触发时机来 ...