链接: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. 【Android】关于去标题栏 | 有的时候代码有效有的时候无效

    原因就在于你的manifest.xml的theme指向谁? 一开始我的theme指向这个↑,所以就改了好多也没用 之后改成这个↓就好了

  2. influxdb: unable to parse points 异常解决总结

    转载请注明出处: influxdb 使用过程经常遇到:unable to parse points  的异常:  unable to parse points 是 InfluxDB 抛出的异常,表示无 ...

  3. APP性能测试-客户端性能测试

    https://blog.csdn.net/xiaomaoxiao336368/article/details/83547318

  4. MinIO客户端之license

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc license mc license info mc license register mc license ...

  5. BUUCTF-Crypto详细Writeup

    每一天都要努力啊    ----2024-01-01 18:11:36 1.一眼就解密 原题:下面的字符串解密后便能获得flag:ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUkl ...

  6. DDD落地实践-架构师眼中的餐厅 | 京东云技术团队

    本文以餐厅场景为叙事主线,以领域驱动为核心思想,结合架构设计与功能设计方法论.是从领域分析到落地的全过程案例,内容偏重于落地,因此不乏一些探讨,欢迎指正. 文章较长.全程干货.耐心读完.必有收获. 本 ...

  7. Lean大神编译的OpenWRT问题汇总

    1.初始密码为password,登录路由器后第一件事要修改默认密码 2.Lean大神编译的OpenWRT无法SSH.SFTP, 3.为了方便操作,一定要编译的时候安装TTYD,但是TTYD默认无法打开 ...

  8. Python脚本猜解网站登录密码(带token验证)

    目录: 关键代码解释 设置请求头 get_token函数获取token值 完整代码: 运行结果: 上一篇文章:一个简单的Python暴力破解网站登录密码脚本 测试靶机为Pikachu漏洞练习平台暴力破 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (173)-- 算法导论13.3 2题

    二.用go语言,将关键字41.38.31.12.19.8连续地插入一棵初始为空的红黑树之后,试画出该结果树. 文心一言: 首先,我们需要了解红黑树的性质.红黑树是一种自平衡二叉查找树,其中每个节点要么 ...

  10. 【scikit-learn基础】--『监督学习』之 决策树分类

    决策树分类算法是一种监督学习算法,它的基本原理是将数据集通过一系列的问题进行拆分,这些问题被视为决策树的叶子节点和内部节点.决策树的每个分支代表一个可能的决策结果,而每个叶子节点代表一个最终的分类结果 ...