链接:https://ac.nowcoder.com/acm/contest/1015/B

题目描述

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)。

示例1

输入

100
2

输出

68

备注:

附:圆柱公式体积V=πR2H侧面积A’=2πRH底面积A=πR2

有点惭愧的是,我并没有自己把它写出来,实在是头疼,以后有需要的时候还会自己写一下。

这里贴下dalao的代码作为学习

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int N, M;
const int inf = 0x3f3f3f3f;
int minv[25], mins[25];
int ans;
void dfs(int r, int h, int layer, int v, int s) {
if(layer == 0) {
if(v == N && ans > s) ans = s;
return;
}
if(N - v < minv[layer]) return;//剪枝1:总体积减去蛋糕当前层以下的层的总体积
//小于上面的层所能构成的最小体积
if(ans - s < mins[layer]) return;//剪枝2:当前得到的最优解减去蛋糕当前层以下的层的总面积
//小于上面的层所能构成的最小面积
if(s + 2 * (N - v) / r > ans) return;//剪枝3:2 * (N - v) / r 表示剩下的体积能组成最小面积
//的极限情况,可以证明,同样的体积组成一个大圆柱体和组成
//多个比一个大圆柱体小的小圆柱体相比,前者的表面积比后者
//要小,所以这种表面积最小的情况再加上本层以下的确定的表
//面积s如果是大于已知最优解s,那么最终结果一定不会比ans小
//返回 。(难理解)
int i, j;
for(i = r; i >= layer; i--) {
if(layer == M) s = i * i; //第一次要加上底面的面积
int maxh = min(h, (N - v - minv[layer - 1]) / i / i); //后者为本层高度最高的情况,
//但再高也不能高过最高高度h
for(j = maxh; j >= layer; j--) {
dfs(i - 1, j - 1, layer - 1, v + i * i * j, s + 2 * i * j);
}
}
}
int main() {
int i;
minv[0] = mins[0] = 0;
for(i = 1; i <= 20; i++) {
minv[i] = minv[i - 1] + i * i * i;
mins[i] = mins[i - 1] + 2 * i * i;
}
while(~scanf("%d %d", &N, &M)) {
ans = inf;
dfs((int)sqrt(N), N, M, 0, 0); //第一和第二个参数分别指最大的半径和最大的高度
if(ans == inf) printf("0\n");
else printf("%d\n", ans);
}
return 0;
}

关于剪枝的一个小总结:

剪枝分为可行性剪枝与最优化剪枝。

可行性剪枝一般的思考过程就是,我一共需要多少,在最多的情况下也无法达到,或最少的情况下也会超过。

那么至于最大与最小到底怎么取到,就本题而言,还有类似的每层递增的题目,可以考虑我从(1,1)开始每层加一,到现在的层数,面积和即为最小面积。而最大,就是把一个变量限制成最小,就可以取得另一个的最大,而对每一个“另一个”,都有一个“这个”的最大与之对应。

最优化剪枝,就是考虑,我现有的面积和已经比最小面积大了,那么不用继续讨论。或者,我现有的面积,加上最小面积,也比最小面积大,那么也可以不再继续。

POJ - 1190 生日蛋糕(深搜+神奇的剪枝)的更多相关文章

  1. Codevs 1710 == POJ 1190 生日蛋糕 == 洛谷P1731

    生日蛋糕 时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ ...

  2. POJ 1190 生日蛋糕 【DFS + 极限剪枝】

    题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...

  3. poj 1190 生日蛋糕 , 强剪枝

    题意: 制作一个体积为Nπ(N<=10000)的M(M<=20)层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆 ...

  4. POJ - 1190 生日蛋糕 dfs+剪枝

    思路:说一下最重要的剪枝,如果当前已经使用了v的体积,为了让剩下的表面积最小,最好的办法就是让R尽量大,因为V = πR 2H,A' = 2πRH,A' = V / R * 2 ,最大的R一定是取当前 ...

  5. POJ 1190 生日蛋糕 剪枝

    Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri ...

  6. POJ 1190 生日蛋糕题解

    题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...

  7. 洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕

    题目传送门(洛谷)  OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态 ...

  8. poj 1190 生日蛋糕

    中文题 题目分析 搜索题,非常好的剪枝 由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第1层,……,最底层的蛋糕为第m层,很明显满足题目条件的前i层的(从顶层(也就是编号 ...

  9. POJ 1190 生日蛋糕(DFS)

    生日蛋糕 Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit Status Descrip ...

  10. poj 1562 简单深搜

    //搜八个方向即可 #include<stdio.h> #include<string.h> #define N 200 char ma[N][N]; int n,m,vis[ ...

随机推荐

  1. 解决Vscode中代码格式化时老换行

    问题: 小颖用vscode的格式化代码后发现代码老是换行,有时看起来就很难受,比如下面的: 问度娘后终于弄好啦,记录下,省的以后换电脑了重装了vscode又不会了,主要是百度给的解决方法好几个,但有的 ...

  2. 【Android】【外包杯】后台管理系统 | 进度day01

    外包杯官方提示:平台不要太大,只是一些小东西包括支付宝和微信小程序打开,无需安装口香糖,餐巾纸有一块屏幕,不需要很大,只需要满足顾客可以看到传播的内容打开橱窗不要有锋利边角,不要求一体,提高场景利用率 ...

  3. 使用nacos配置无效,原因:项目中 gateway服务配置的 application的name:@artifactId@ 和nacos上配置的DataID 不一致导致

    遇到一个问题,项目启动后一致无法正常登陆进入后端,登陆时一直报错返回null,排查后发现是自己粗心,项目中 gateway服务配置的 application的name:@artifactId@   和 ...

  4. [UOJ#748] [UNR#6 1B] 机器人表演

    在这个科技发达的年代,真人表演已经落伍了.参加完 UOI 后,hehe 蚤去到了下山市大剧院,观看下山市最火爆的机器人表演. 机器人有时比人类更能抓住事情的本质.所谓表演,其实也就是开场有若干个机器人 ...

  5. 机器人行业数据闭环实践:从对象存储到 JuiceFS

    JuiceFS 社区聚集了来自各行各业的前沿科技用户.本次分享的案例来源于刻行,一家商用服务机器人领域科技企业. 商用服务机器人指的是我们日常生活中常见的清洁机器人.送餐机器人.仓库机器人等.刻行采用 ...

  6. 累加器Adder

    ① java8引⼊的,相⽐较是⼀个⽐较新的类 ② ⾼并发下LogAdder⽐AtomicLog效率⾼,不过本质是空间换时间 ③ 竞争激烈的时候,LongAdder把不同线程对应到不同的Cell上进⾏修 ...

  7. MySQL运维10-Mycat分库分表之一致性哈希分片

    一.一致性哈希分片 一致性哈希分片的实现思路和我们之前介绍的水平分表中的取模分片是类似的.只不过取模分片,采用的是利用主键和分片数进行取模运算,然后根据取模后的结果,将数据写入到不同的分片数据中.但是 ...

  8. Kernel Memory 入门系列:自定义处理流程

    Kernel Memory 入门系列:自定义处理流程 在整个文档预处理的流程中,涉及到很多的处理步骤,例如:文本提取,文本分片,向量化和存储.这些步骤是Kernel Memory中的默认提供的处理方法 ...

  9. 使用Mybatis自定义插件实现不侵入业务的公共参数自动追加

    背景 后台业务开发的过程中,往往会遇到这种场景:需要记录每条记录产生时间.修改时间.修改人及添加人,在查询时查询出来. 以往的做法通常是手动在每个业务逻辑里耦合上这么一块代码,也有更优雅一点的做法是写 ...

  10. ElasticSearch之Exists API

    检查指定名称的索引是否存在. 命令样例如下: curl -I "https://localhost:9200/testindex_002?pretty" --cacert $ES_ ...