原题链接:AcWing 168. 生日蛋糕

设当前体积是\(v,h、r\)分别记录每层的高度和半径,由于整个蛋糕的上表面面积等于最大蛋糕的圆面积,所以枚举到最大一层的时候直接加上即可。

  1. 优化搜索顺序:搜数量小的分支,可以从蛋糕最下边一层开始搜索,因为最下边一层占体积最大,然后对于枚举半径\(R\)和高度\(H\),肯定是先枚举半径\(R\),因为它对体积的贡献是平方级别的。

  2. 上下界剪枝:在第\(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)]\)

  3. 可行性剪枝:

    预处理出每一层的最小体积和表面积,显然,第\(1 到 i\)层的\(r\)分别取\(1, 2, 3, ..., i\)即可,高度也分别取\(1, 2, 3, ..., i\)。那么当当前\(v\)加\(1\)到\(depth - 1\)层的\(minv\)大于\(N\)那么直接返回。

  4. 最优性剪枝\(1\):

    如果当前表面积\(s\)加上\(1\)到\(depth - 1\)层的\(mins\),那么就剪枝。

  5. 最优性剪枝\(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. 生日蛋糕的更多相关文章

  1. AcWing 166. 数独

    题目地址 https://www.acwing.com/problem/content/description/168/ 题目描述 数独是一种传统益智游戏,你需要把一个9 × 9的数独补充完整,使得图 ...

  2. 由于目标计算机积极拒绝,无法连接。 192.168.1.106:8078 说明: 执行当前 Web 请求期间,出现未经处理的异常。

    请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Net.Sockets.SocketException: 由于目标计算机积极拒绝,无法连接. 1 ...

  3. ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题

    scp免密码登录:Linux基础 - scp免密码登陆进行远程文件同步 执行scp一直是OK的,某天在本地生成了公钥私钥后,scp到某个IP报以下错误 The authenticity of host ...

  4. Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误

    这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面.    当时,我仔细检查了一下自己的代码,并 ...

  5. POJ1190生日蛋糕[DFS 剪枝]

    生日蛋糕 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18236   Accepted: 6497 Description ...

  6. 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 ...

  7. 部署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 ...

  8. 为什么局域网IP是192.168开头?

    IPv4地址分为A.B.C.D.E五类,除去特殊作用的D.E两类,剩下的A.B.C三类地址是我们常见的IP地址段.A类地址的容量最大,可以容纳16777214个主机,B类地址可以容纳65534个主机, ...

  9. NYOJ题目168房间安排

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAssAAAOTCAIAAADGwNmiAAAgAElEQVR4nOy9PY7cyLPufTchXwsZu9

  10. 生日蛋糕—dfs

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

随机推荐

  1. 2021-7-12 VUE的组件认识

    VUE组件简单实例 <!DOCTYPE html> <html> <head> <title> </title> </head> ...

  2. pandas取出包含某个值的所有行

    pandas取出包含某个值的所有行df = df[df["from_account"].str.contains("fcwhx")] pandas取出不包含某个 ...

  3. Mapbox Style 规范

    https://my.oschina.net/u/3185947/blog/4819218

  4. 论文解读(LightGCL)《LightGCL: Simple Yet Effective Graph Contrastive Learning for Recommendation》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:LightGCL: Simple Yet Effective Graph Contrastive Lear ...

  5. 一文搞明白STM32芯片存储结构

    一.前言 本篇介绍STM32芯片的存储结构,ARM公司负责提供设计内核,而其他外设则为芯片商设计并使用,ARM收取其专利费用而不参与其他经济活动,半导体芯片厂商拿到内核授权后,根据产品需求,添加各类组 ...

  6. Docker部署cas

    一.首先安装cas镜像 1.拉取cas docker镜像 docker pull apereo/cas 2.启动容器: docker run  --name cas -p 8443:8443 -p 8 ...

  7. 给你的 SpringBoot 工程部署的 jar 包瘦瘦身吧!

    之前有写过一篇有关maven插件的文章:spring-boot-maven-plugin插件详解 一.需求背景 我们知道Spring Boot项目,是可以通过java -jar 包名 启动的. 那为什 ...

  8. 递归解析Json,实现生成可视化Tree+快速获取JsonPath

    内部平台的一个小功能点的实现过程,分享给大家: 递归解析Json,可以实现生成可视化Tree+快速获取JsonPath. 步骤: 1.利用JsonPath读取根,获取JsonObject 2.递归层次 ...

  9. 如何查询4GL程序中创建的临时表中的数据

    前提:将dba_segments这个表的select权限授权给各个营运中心(即数据库用户) ①.用sys账号以dba的权限登录数据库 <topprod:/u1/topprod/tiptop> ...

  10. replace批量替换、表删除数据查询用法

    一. select * from baec_file where bacti='1'order by baec01; select baec02,REPLACE(baec02,'白班','A班') f ...