AcWing 168. 生日蛋糕
原题链接:AcWing 168. 生日蛋糕
设当前体积是\(v,h、r\)分别记录每层的高度和半径,由于整个蛋糕的上表面面积等于最大蛋糕的圆面积,所以枚举到最大一层的时候直接加上即可。
优化搜索顺序:搜数量小的分支,可以从蛋糕最下边一层开始搜索,因为最下边一层占体积最大,然后对于枚举半径\(R\)和高度\(H\),肯定是先枚举半径\(R\),因为它对体积的贡献是平方级别的。
上下界剪枝:在第\(depth\)层时,对于\(R\)与\(H\)可以求一个范围:
枚举\(R \in [depth, \,\, min( \lfloor \sqrt{N - v} \rfloor, \,\, r[depth + 1] - 1)]\),
枚举\(H \in [depth, \,\, min( \lfloor cfrac{(N - v)}{R^2} \rfloor, \,\, h[depth + 1] - 1)]\)
可行性剪枝:
预处理出每一层的最小体积和表面积,显然,第\(1 到 i\)层的\(r\)分别取\(1, 2, 3, ..., i\)即可,高度也分别取\(1, 2, 3, ..., i\)。那么当当前\(v\)加\(1\)到\(depth - 1\)层的\(minv\)大于\(N\)那么直接返回。最优性剪枝\(1\):
如果当前表面积\(s\)加上\(1\)到\(depth - 1\)层的\(mins\),那么就剪枝。最优性剪枝\(2\):
利用\(h\)和\(r\)数组,\(1\)到\(depth-1\)层的体积可以表示为 \(n - v = \sum\limits_{k = 1}^{depth-1} h[k] * r[k]^2\),1到depth - 1层的表面积可以表示为\(2 * \sum\limits_{k=1}^{depth - 1} h[k]*r[k]\)。利用放缩法,\(2 * \sum\limits_{k=1}^{depth - 1} h[k]*r[k] = \cfrac{2}{r[depth]} * \sum\limits_{k = 1}^{depth - 1} h[k] * r[k] * r[depth] \geq \cfrac{2}{r[depth]} * \sum\limits_{k = 1}^{depth - 1} h[k] * r[k]^2 \geq \cfrac{2(n - v)}{r[depth]}\),所以当\(\cfrac{2(n - v)}{r[depth]} + s\)大于已经搜到的答案时,可以剪枝。
// Problem: 生日蛋糕
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/170/
// Memory Limit: 10 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
const int N = 25, INF = 1E9;
int n, m;
int R[N], H[N];
int res = INF;
int minv[N], mins[N];
void dfs(int u, int v, int s) {
if (v + minv[u] > n) return;
if (s + mins[u] >= res) return;
if (s + 2 * (n - v) / R[u + 1] >= res) return;
//说明已经从上往下搜到了最后一层
if (!u) {
if (v == n) res = s;
return;
}
for (int r = min(R[u + 1] - 1, (int)sqrt(n - v)); r >= u; r--) {
for (int h = min(H[u + 1] - 1, (n - v) / r / r); h >= u; h--) {
int t = 0;
if (u == m) t = r * r;
R[u] = r, H[u] = h;
dfs(u - 1, v + r * r * h, s + 2 * r * h + t);
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
minv[i] = minv[i - 1] + i * i * i;
mins[i] = mins[i - 1] + i * i * 2;
}
R[m + 1] = H[m + 1] = INF;
dfs(m, 0, 0);
if (res == INF) res = 0;
cout << res << endl;
return 0;
}
AcWing 168. 生日蛋糕的更多相关文章
- AcWing 166. 数独
题目地址 https://www.acwing.com/problem/content/description/168/ 题目描述 数独是一种传统益智游戏,你需要把一个9 × 9的数独补充完整,使得图 ...
- 由于目标计算机积极拒绝,无法连接。 192.168.1.106:8078 说明: 执行当前 Web 请求期间,出现未经处理的异常。
请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Net.Sockets.SocketException: 由于目标计算机积极拒绝,无法连接. 1 ...
- ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
scp免密码登录:Linux基础 - scp免密码登陆进行远程文件同步 执行scp一直是OK的,某天在本地生成了公钥私钥后,scp到某个IP报以下错误 The authenticity of host ...
- Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误
这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面. 当时,我仔细检查了一下自己的代码,并 ...
- POJ1190生日蛋糕[DFS 剪枝]
生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18236 Accepted: 6497 Description ...
- oracle 11g RAC安装节点二执行结果错误CRS-5005: IP Address: 192.168.1.24 is already in use in the network
[root@testdb11b ~]# /u01/app/oraInventory/orainstRoot.sh Changing permissions of /u01/app/oraInvento ...
- 部署samba服务之后,在客户端用挂载访问的方式,错误信息:mount: block device //192.168.1.108/mysqldata is write-protected, mounting read-only mount: cannot mount block device //192.168.1.108/mysqldata read-only
部署samba服务之后,在客户端用挂载访问的方式,错误信息:mount: block device //192.168.1.108/mysqldata is write-protected, moun ...
- 为什么局域网IP是192.168开头?
IPv4地址分为A.B.C.D.E五类,除去特殊作用的D.E两类,剩下的A.B.C三类地址是我们常见的IP地址段.A类地址的容量最大,可以容纳16777214个主机,B类地址可以容纳65534个主机, ...
- NYOJ题目168房间安排
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAssAAAOTCAIAAADGwNmiAAAgAElEQVR4nOy9PY7cyLPufTchXwsZu9
- 生日蛋糕—dfs
Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri ...
随机推荐
- SpringBoot里的Servlet和实现
Servlet 接口,一个规范, SpringBoot Spring Boot 是 Spring 的子项目,正如其名字,提供 Spring 的引导( Boot )的功能. 通过 Spring Boot ...
- C# 中的 数组[]、ArrayList、List
C# 中的 数组[].ArrayList.List 数组 在 C# 中,数组实际上是对象,而不只是如在 C 和 C++ 中的连续内存的可寻址区域. 属性: 数组可以是一维.多维或交错的. 创建数组实例 ...
- ChatGPT插件开发实战
1.概述 ChatGPT是一款由OpenAI推出的先进对话模型,其强大的自然语言处理能力使得它成为构建智能对话系统和人机交互应用的理想选择.为了进一步拓展ChatGPT的功能和适应不同领域的需求,Op ...
- 升讯威在线客服系统的并发高性能数据处理技术:高性能TCP服务器技术
我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可. 客户组 ...
- Dami 基于事件总线的本地过程调用框架(首次发版)
Dami,专为本地多模块之间通讯解耦而设计(尤其是未知模块.隔离模块.领域模块).零依赖,特适合 DDD. 特点 结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作异步响应. 支持事务 ...
- Solution -「SP 106」BINSTIRL
Description Link. 求 \(\begin{Bmatrix}n \\ m\end{Bmatrix}\bmod2\) Solution 求 \[\begin{aligned} \begin ...
- Llama2-Chinese项目:2.3-预训练使用QA还是Text数据集?
Llama2-Chinese项目给出pretrain的data为QA数据格式,可能会有疑问pretrain不应该是Text数据格式吗?而在Chinese-LLaMA-Alpaca-2和open-l ...
- u-boot启动流程
U-Boot(Universal Bootloader)是一个通用的开源引导加载程序,通常用于嵌入式系统中,负责引导操作系统或加载 Linux 内核等任务.U-Boot的启动流程可以概括为以下几个关键 ...
- strcpy()函数详解
strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下: · 函数声明以及实现代码 char *strcpy(char *dst, const char *src);char ...
- 【matplotlib 实战】--平行坐标系
平行坐标系是一种统计图表,它包含多个垂直平行的坐标轴,每个轴表示一个字段,并用刻度标明范围.通过在每个轴上找到数据点的落点,并将它们连接起来形成折线,可以很容易地展示多维数据.随着数据增多,折线会堆叠 ...