洛谷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的圆柱 ...
随机推荐
- .Net MVC4 log4net的配置
一.首先在使用log4net记录日志的时候,我们要引用log4net.dll文件 二.在web.config中添加一下配置代码 <configSections> <!-- For m ...
- 数组中元素累加 reduce
例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- 爬虫 之Requests库的详细使用
1.什么是Requests? Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库. 它比urllib更加方便,可以节约我 ...
- liunx安装nginx
参考 https://blog.csdn.net/dyllove98/article/details/41120789 1,去官网下载最新的包 官网地址:http://nginx.org/downlo ...
- timestamp 与 nonce 防止重放攻击
重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程. 首先要明确一个事情,重放攻击是二次请求,黑客通过抓包获取到 ...
- 解决spring多线程不共享事务的问题
在一个事务中使用多线程操作数据库时,若同时存在对数据库的读写操作,可能出现数据读取的不准确,因为多线程将不会共享同一个事务(也就是说子线程和主线程的事务不一样),为了解决这个问题,可以使用spring ...
- fastjson与各类型的转换
参考:https://www.cnblogs.com/ceshi2016/p/7381478.html http://www.cnblogs.com/goody9807/p/4244862.html ...
- 使用layui 做后台管理界面,在Tab中的链接点击后添加一个新TAB的解决方法
给链接或按钮 添加 onclick="self.parent.addTab('百度','http://www.baidu.com','icon-add')" 如: <a h ...
- rmse均方根误差
rmse=sqrt(sum((w-r).^2)/length(w))
- Windows Server2008、IIS7启用CA认证及证书制作完整过程
1 添加活动目录证书服务 1.1 打开服务器管理器,右键点击角色,选择“添加角色”,在“添加角色向导”窗口左侧面板选择“服务器角色”,然后勾选“Active Dire ...