链接: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. 每天5分钟复习OpenStack(十一)Ceph部署

    在之前的章节中,我们介绍了Ceph集群的组件,一个最小的Ceph集群包括Mon.Mgr和Osd三个部分.为了更好地理解Ceph,我建议在进行部署时采取手动方式,这样方便我们深入了解Ceph的底层.今天 ...

  2. 串ababaaababaa的next和串ababaabab的nextval

    这个next求法我看了视频和网上的,发现有两种求法,一种是求最左边和最右边相等的最大个数, 就比如说串ababaaababaa,这个 所以这个3的位置为1,依次下来. 这个唯一要注意的是,是按照你选择 ...

  3. IP交付标准总结。

    RTL顶层代码,IP内部需要IP自己完成连接并保证正确,CM/PLL/MCU/SRAM/TX/RX内部模块不接受外部进行拼接,DFT内部自己处理.IP用到的宏,名称功能文档要说明清楚.优先使用硬核IP ...

  4. 浅谈SQL优化小技巧

    回顾MySQL的执行过程,帮助介绍如何进行sql优化. (1)客户端发送一条查询语句到服务器: (2)服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据: (3)未命中缓存后,MySQL通过 ...

  5. 【YOLOv5】实现扑克牌的点数识别

    前言 其实年初的时候,我也跟着别人的源码,用 Tensoflow 实现过扑克牌的目标检测.虽然也通过博文的方式记录了,但是那个项目使用的 TF 版本比较旧,自身对 TF 并不熟.后期如果说要升级或修改 ...

  6. 在 JMeter 中使用 JSON 提取器提取特定条件下的值

    当你需要在 JMeter 中对接收到的 JSON 响应进行处理时,JSON 提取器是一个非常有用的工具.在本文中,我们将讨论如何使用 JSON 提取器来提取特定条件下的值,以满足你的需求. 问题描述 ...

  7. ubuntu 22.04搭建本地源

    ubuntu 22.04搭建本地源 基于服务器无法联网的情况下,从一台可以上网的服务器下载软件包和依赖,再在无法联网的服务器中搭建本地源,安装环境. 下载(包括依赖): cd /root mkdir ...

  8. 安卓之各组件的LayoutParams分析

    文章摘要 在Android开发中,LayoutParams是一个非常重要的概念,它用于描述View在其父容器中的布局行为.不同的ViewGroup有不同的LayoutParams子类,例如Linear ...

  9. Celery架构和主要模块

    **任务模块 ** 包含异步任务和定时任务.其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列. **消息中间件 Broker * ...

  10. 【C++】【图像处理】均值滤波 and 高斯滤波 and 中值滤波 (低通滤波器)and Sobel算子边缘提取算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)

    1 void meanFilter(BYTE* image, int width, int height, BYTE* outImg) 2 { 3 //均值滤波 4 int smth[9]; 5 in ...