洛谷P1731 生日蛋糕
李煜东太神了啊啊啊啊啊!
生日蛋糕,著名搜索神题(还有虫食算)。
当年的我30分....
这哥们的程序0ms...
还有他的树网的核也巨TM神。
疯狂剪枝!
DFS(int d, int s, int v, int lastR, int lastH)
剪枝1.考虑在每一层内枚举H,R时的上下界。
最小肯定是当前层数d,最大呢?
考虑:
N - v = ∑hi * ri * ri(i = 1...d)
N - v >= R * R * H
R的最大值显然是H取最小的时候。
H = 1 时,R * R <= N - v
R <= sqrt(N - v)
接下来考虑H的最大:
R * R * H <= N - v
H <= (N - v) / (R * R)
剪枝2.
预处理出前 i 层的最小表面积/体积,记为mins和minv。
则 若在某一层的 v + minv[d] > N 剪枝
若在某一层的 s + mins[d] >= ans 剪枝
剪枝3.
观察 N 和 S 的公式:
N - v = ∑ri * ri * hi (i = d...M)
S - s = 2 * ∑ri * hi(i = d...M)
很相似。于是考虑得出这两个式子之间的不等关系:
rd * (S - s) >= 2 * ∑ri * ri * hi(i = d...M) = 2 * (N - v)
rd * (S - s) >= 2 * (N - v)
2 * (N - v) / rd + s <= S
如果 ans <= 2 * (N - v) / rd + s 那么 ans <= S
此时即可剪枝。
这样我们就得到了一个0ms的玄学搜索...
疯狂%李煜东大佬%%%
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int N2 = , INF = 0x7f7f7f7f; int N, M, ans = INF, mins[N2], minv[N2]; void DFS(int d, int s, int v, int lastR, int lastH) {
if(!d) {
if(v == N) {
ans = min(ans, s);
}
return;
}
for(int R = min(lastR - , (int)(sqrt(N - v))); R >= d; R--) {
/*if((2 * (N - v)) / R + s >= ans) { /// WA
continue;
}*/
if(d == M) {
s = R * R;
}
for(int H = min(lastH - , (N - v) / (R * R)); H >= d; H--) {
int v2 = v + R * R * H;
int s2 = s + * R * H;
if(( * (N - v2)) / R + s2 >= ans) {
continue;
}
if(s2 + mins[d - ] >= ans) {
continue;
}
if(v2 + minv[d - ] > N) {
continue;
}
DFS(d - , s2, v2, R, H);
}
}
return;
} void init(int n) {
for(int i = ; i <= n; i++) {
mins[i] = mins[i - ] + * i * i;
minv[i] = minv[i - ] + i * i * i;
}
return;
} int main() {
scanf("%d%d", &N, &M); init(M); DFS(M, , , INF, INF); printf("%d", (ans == INF) ? : ans);
return ;
}
AC代码
看我的注释,那个神奇的地方如果剪枝就会WA两个点,剪早了,但是不知道原理...
洛谷P1731 生日蛋糕的更多相关文章
- 洛谷 P1731 生日蛋糕
/*洛谷 1731 生日蛋糕 傻傻的-1 T成了傻逼*/ #include<cstdio> #include<iostream> #include<cmath> # ...
- 洛谷P1731生日蛋糕(dfs+剪枝)
P1731 生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为R ...
- 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)
洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...
- 洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕
题目传送门(洛谷) OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态 ...
- 洛谷 P1731 [NOI1999]生日蛋糕
P1731 [NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M ...
- 洛谷——P1731 [NOI1999]生日蛋糕
P1731 [NOI1999]生日蛋糕 搜索+剪枝 常见的剪枝: 若当前状态+后面所要搜索的最差的状态$>$或是$<$最后的状态,就返回 预处理最差的状态 #include<iost ...
- C++ 洛谷 P1731 [NOI1999]生日蛋糕
P1731 [NOI1999]生日蛋糕 一本通上也有. 这TM是一道极其简单的深搜剪枝(DP当然可以的了,这里我只讲深搜). 首先圆柱公式:(有点数学基础都知道) V=πR2H S侧=π2RH S底= ...
- [洛谷P1731][NOI1999]生日蛋糕(dfs)(剪枝)
典型的深搜+剪枝策略 我们采用可行性剪枝.上下界剪枝.优化搜索顺序剪枝.最优性剪枝的方面来帮助我们进行剪枝. 也许有人还不知道剪枝,那我就弱弱地为大家补习一下吧qwq: .优化搜索顺序: 在一些搜索问 ...
- 洛谷P1731 [NOI1999]生日蛋糕(爆搜)
题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱 ...
随机推荐
- sqlserver常用语法
--临时表 IF OBJECT_ID('tempdb..#Entry') is not null BEGIN DROP TABLE #Entry END ------------------- ...
- 谈谈B-树和B+树及其应用
待更!!! B-树和B+树的应用:数据搜索和数据库索引 B+/-Tree原理及mysql的索引分析 从B树.B+树.B*树谈到R 树 B树.B-树.B+树.B*树
- 使Python中的turtle模块画图两只小羊
turtle.circle(radius, extent=None, steps=None) 描述: 以给定半径画圆 参数: radius(半径); 半径为正(负),表示圆心在画笔的左边(右边)画圆 ...
- 设计模式笔记:开闭原则(OCP,The Open-Closed Principle)
1. 开闭原则概述 开闭原则(OCP,The Open-Closed Principle)两个主要特征: (1)对扩展开放(open for extension):模块的行为的可以扩展的,当应用的需求 ...
- QTP 自动化测试桌面程序--笔记(关闭 启动程序脚本) 、安装
0 安装qtp .exe 文件 安装 插件文件(如delph) 1 关闭 启动程序: 将要操作的程序-存入localdatatable中 设置 迭代一次 rem SystemUtil.ClosePro ...
- RabbitMQ在Ubuntu 16.04下的安装与配置
安装执行如下命令: echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d ...
- 为什么int型最大的数是2147483647
32位的电脑中,用二进制表示,最大的就是32个1,用十进制表示为2^32-1,大概40多亿(4294967295) 对于有符号的,第一位用作表示正负(0,1),最大的就是31个1,用十进制表示为2^3 ...
- Lodop文本项相对于文本框居中 两端对齐
Lodop中ADD_PRINT_TEXT默认内容是相对于文本框居左的,如果想要设置相对于文本框居中,可用如下语句.还有一种是两端对齐,可以让内容的两端阿和文本框的最左和最右端对齐,文本项内容布满文本框 ...
- 将数组Arrays转成集合List
String[] split = pids.split("-"); //将数组split转成集合 List<String> asList = Arrays.asList ...
- React 学习(五) ---- 条件和列表渲染
条件渲染 React中的条件渲染和我们平常写的js 代码一样,都是用的if else, 只不过在if else 中它的返回值是jsx, 根据不同的条件渲染不同的UI. 先写两个组件 //登录的用户显示 ...