每次做一道 NOI 系列的估计都很激动吧,对于我这种萌新来说(


P1731 [NOI1999]生日蛋糕

练习剪枝技巧,关于剪枝,欢迎看我的垃圾无意义笔记

这道题是有一定难度的,需要运用各种高科技剪枝(?

如果泥能独立 AC 这道题,就可以拿到 NOI 铜牌了! (不过是1999年的,现在肯定难多了

其实这道题根本不需要考虑 \(\pi\) 因为:

\[\begin{aligned}
V_{\text{圆柱}} & = S_{\text{圆柱}} \times h\\
&= \pi r^2\times h\\
N & = r^2\times h
\end{aligned}\]
\[\begin{aligned}
S_{\text{圆柱侧}} & = 2\pi r \times h\\
S &= 2rh\\
S &= \frac{2N}{r}
\end{aligned}\]

因为为了方便,搜索的参数为 \(5\) 个:

\(\text{dfs(int ceng, int nestv, int r, int h, int s);}\)

\(\text{ceng = 当前层数, nestv = 剩余体积, r = 半径, h = 高度, s = 体积}\)

体积为 \(100\) 的栗子:画张图,更好理解:

去搜每一层蛋糕的半径和高度。因为是整数,所以把所有的半径和高度枚举一遍, \(r\) 的根节点从 \(10\) 开始。从最大值到最小值,如果体积明显超出了,就可以剪枝。

枚举第一层蛋糕的高度。

此时的时间复杂度是 \(O(n^2)\)

因为比较暴力,所以必须用到各种剪枝,在 \(O(n^2)\) 的基础上进行剪枝

  1. 可行性剪枝

  2. 最优化剪枝

  3. 上下界剪枝

  4. 搜索顺序剪枝

    半径从大到小,从小到大。

    高度从大到小,从小到大。

    共 4 种搜索顺序,找到最快的顺序。

最终就能 AC 本题啦~

放上 \(dfs\) 代码,有注释应该很好理解吧/kk:

void dfs(int ceng, int restv, int r, int h, int s) {
//ceng为已用层数,restv为剩余体积,r为当前最高层蛋糕半径,h为当前最高层蛋糕高度,s为已有表面积/π
if(ceng == m && restv == 0) //蛋糕已完成,即层数ceng==m且体积用完 {
ans = min(ans, s); //更新答案为最优解
return;
}
if(restv < 0) return; //剩余体积小于0表示体积超过了预定的值
if(s + 2 * restv / r >= ans) return; //若当前总表面积+该层往上所有表面积的最小和>=目前最优解
//简单一点可以把每一层的侧面积看做最小的1,那么后续剩下部分的侧面积就等于剩余层数m-ceng
//数据严格一点就可以从剩余体积去计算出剩余最小侧面积2 * restv / r,可改为if(s + 2 * restv / r >= ans)
if(r * r * h * (m - ceng) < restv) return; //后续能做出蛋糕的最大体积<当前剩余体积
for(int i = r - 1; i >= m - ceng; i--) //枚举下一层所有可能的半径
for(int j = h - 1; j >= m - ceng; j--) //枚举下一层所有可能的高度
if(ceng != 0) dfs(ceng + 1, restv - i * i * j, i, j, s + 2 * i * j);
else dfs(ceng + 1, restv - i * i * j, i, j, s + 2 * i * j + i * i);
//第一层需要计算上表面积,其他层只需计算侧面积即可,故需分类讨论
}

【题解】NOI 系列题解总集的更多相关文章

  1. IEEE Bigger系列题解

    Bigger系列题解 Bigger Python 坑点在于要高精度以及表达式求值,用java写可以很容易避免高精度问题 然后这道题就可以AC了 代码 import java.io.*; import ...

  2. QTREE系列题解

    打了快一星期的qtree终于打完了- - (其实还有两题改不出来弃疗了QAQ) orz神AK一星期前就虐完QTREE 避免忘记还是简单写下题解吧0 0 QTREE1 题意: 给出一颗带边权树 一个操作 ...

  3. 【noi openjudge题解】最低通行费

    这道题完全没有必要去计算限制时间,把时间当做一个参数来做就行了.知道了这一点之后就可以直接使用DP求解了 #include <algorithm> #include <iostrea ...

  4. SPOJ_QTREE系列题解

    QTREE4 #pragma comment(linker, "/STACK:102400000,102400000") //#include<bits/stdc++.h&g ...

  5. GSS 系列题解

    GSS GSS1 随便猫树或者线段树,就可以过了 猫树不说,线段树可以维护左边最大,右边最大,区间最大,区间值然后就做出来了. //Isaunoya #pragma GCC optimize(2) # ...

  6. GSS系列题解——最大子段和系列

    开坑啦! 2019 3/28 以前一直不知道怎么搞最大子段和,如今终于可以学习,其实真的很简单啊. 2019 3/29 树链剖分上最大子段和也OK啦 前置技能:线段树 题目大意:询问区间[l,r]的最 ...

  7. NOI Online 题解

    T1 对\(t_i = 1\)的边,将\(u_i, v_i\)连一条边权为\(1\)的边.否则连一条边权为\(0\)的边. 对于每一个连通块,若图中不存在一条边权之和为奇数的圈,则可以将这个连通块二染 ...

  8. [题解] [NOI Online 2021 入门组 T3] 重力球

    题目大意 在一个 \(n\times n\) 的矩形中,题目会给出 \(m\) 个障碍物.有两个小球,你可以选定四个方向(上下左右)的其中一个,小球会朝着这四个方向一直滚动,直到遇到障碍物或是矩形的边 ...

  9. 小埋的Dancing Line之旅:比赛题解&热身题题解

    答疑帖: 赞助团队:UMR IT Team和洛谷大佬栖息地 赛后题解:更新了那两道练手题的题解 赛时公告,不过一些通知也可能在团队宣言里发出 如果各位发现重题,请将你认为重复的题目链接连同这次比赛的题 ...

随机推荐

  1. Kafka 生产者分区策略

    分区策略 1)分区的原因 (1)方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 topic 又可以有多个 Partition 组成,因此整个集群就可以适应任意大小的 ...

  2. 掉电后osdmap丢失无法启动osd的解决方案

    前言 本篇讲述的是一个比较极端的故障的恢复场景,在整个集群全部服务器突然掉电的时候,osd里面的osdmap可能会出现没刷到磁盘上的情况,这个时候osdmap的最新版本为空或者为没有这个文件 还有一种 ...

  3. [web安全原理分析]-SSRF漏洞入门

    SSRF漏洞 SSRF漏洞 SSRF意为服务端请求伪造(Server-Side Request Forge).攻击者利用SSRF漏洞通过服务器发起伪造请求,就这样可以访问内网的数据,进行内网信息探测或 ...

  4. ATM管理系统(三)

    一.作业信息 博客班级 软件工程 作业要求 作业要求 作业目标 你理解的作业目标具体内容 学号 3180701218 二.题目要求 编写一个ATM管理系统,语言不限,要求应包括以下主要功能:(1)开户 ...

  5. FL Studio 插件使用教程 —— 3x Osc(下)

    我们继续深入研究一下fl的3x Osc教程. 包络线是修饰音色非常重要的一个部件,有了它,音色不再是单调的长音,而能有长有短,有深有浅,变得丰富多彩.因此,学习包络线的运作原理很重要. 图1:包络线界 ...

  6. Folx使用教程:怎么通过设置标签分类下载内容

    很多Mac OS下载软件从网上下载各种各样的文件,一般默认都会存放在"下载"文件夹中.如果不是经常整理"下载"文件夹,久而久之,该文件夹会变得庞大而杂乱. 如果 ...

  7. Gradle全局代理配置

    配置文件路径:C:\Users\myName\.gradle\gradle.properties 代理配置内容: systemProp.http.proxyHost=127.0.0.1 systemP ...

  8. Shamir秘密共享方案 (Python)

    Shamir's Secret Sharing scheme is an important cryptographic algorithm that allows private informati ...

  9. 通用于wps和excel的ntlm hashes窃取利用方式

    https://evi1cg.me/archives/Get_NTLM_Hashes.html介绍了通过Microsoft Office 窃取 NTLM Hashes. 不过这种插入方法不适用于wps ...

  10. pip更新报错问题

    pip更新错误如下: WARNING: You are using pip version 20.1.1; however, version 20.2 is available. You should ...