题目传送门(洛谷)  OR 题目传送门(POJ)

解题思路:

一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝.

1.如果当前状态答案已经比我们以前某个状态求出来的答案还要大,那么我们就没有必要搜下去,直接return.

2.如果有某个状态,在这之后假设所有答案都是最优,还比我们当前已经求出来的最小值大,那么哇哦们也没有必要搜下去,return;

3.如果在某个状态之后,所有层蛋糕都用最大体积,也无法达到答案体积,那么也没必要搜,return.

以上三条剪枝对于这道题来说已经够了.

如果还想再优化一下,那么可以求出每层蛋糕当前R和H范围,在范围之间枚举,这样做也会使程序快一点,对于这道题来说,没必要//就因为写这个剪枝花了我1个半小时,最后还没写对,直接去掉这条剪枝,AC.

AC代码:

 #include<cstdio>
#include<cmath>
#include<iostream>
#include<math.h> using namespace std; int n,m,ans = 0x7f7f7f7f,_min[],oo[]; int find_max(int nn,int h,int r) {
int vv = ;
for(int i = ;i <= m - nn + ; i++)
vv += (h - i) * (r - i) * (r - i);
return vv;
} inline void dfs(int deep,int h,int r,int v,int len) {
if(deep == m + ) {
if(v != ) return ;
ans = min(ans,len);
return ;
}
if(v < ) return ;
int u = len;
u += _min[deep];
if(ans < u) return ;
u = find_max(deep,h,r);
if(v > u && deep != ) return;
for(int i = ;i < r; i++) {
for(int j = ;j < h; j++) {
if(i * i * j > v) continue;
if(a[deep][i][j]) continue;
if(deep == ) len = i * i;
dfs(deep + ,j,i,v - j * i * i,len + * j * i);
}
}
} inline void special() {
for(int i = ;i <= sqrt(n); i++) {
if(n % (i * i) != ) continue;
int j = n / (i * i);
int len = i * i + i * * j;
ans = min(ans,len);
}
} int main()
{
scanf("%d%d",&n,&m);
for(int p = m;p >= ; p--)
_min[p] = _min[p+] + (m - p + ) * * (m - p + );
if(m == ) special();
else dfs(,,,n,);
if(ans == 0x7f7f7f7f) printf("");
else printf("%d",ans);
return ;
}

洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕的更多相关文章

  1. 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)

    洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...

  2. 洛谷 P1731 [NOI1999]生日蛋糕

    P1731 [NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M ...

  3. 洛谷——P1731 [NOI1999]生日蛋糕

    P1731 [NOI1999]生日蛋糕 搜索+剪枝 常见的剪枝: 若当前状态+后面所要搜索的最差的状态$>$或是$<$最后的状态,就返回 预处理最差的状态 #include<iost ...

  4. C++ 洛谷 P1731 [NOI1999]生日蛋糕

    P1731 [NOI1999]生日蛋糕 一本通上也有. 这TM是一道极其简单的深搜剪枝(DP当然可以的了,这里我只讲深搜). 首先圆柱公式:(有点数学基础都知道) V=πR2H S侧=π2RH S底= ...

  5. [洛谷P1731][NOI1999]生日蛋糕(dfs)(剪枝)

    典型的深搜+剪枝策略 我们采用可行性剪枝.上下界剪枝.优化搜索顺序剪枝.最优性剪枝的方面来帮助我们进行剪枝. 也许有人还不知道剪枝,那我就弱弱地为大家补习一下吧qwq: .优化搜索顺序: 在一些搜索问 ...

  6. 洛谷P1731 [NOI1999]生日蛋糕(爆搜)

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

  7. 洛谷 P1731 [NOI1999]生日蛋糕(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1731 解题思路 既然看不出什么特殊的算法,显然是搜索... dfs(u,v,s,r0,h0)分别表示: u为 ...

  8. POJ1190 洛谷P1731 NOI1999 生日蛋糕

    生日蛋糕(蛋糕是谁?) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20272   Accepted: 7219 Desc ...

  9. 洛谷 P1731 [NOI1999]生日蛋糕 题解

    每日一题 day53 打卡 Analysis 观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦. 就是每次枚举r和h,如 ...

随机推荐

  1. P1039 到底买不买

    转跳点:

  2. Express - 采用bcryptjs进行密码加密

    1.安装bcryptjs模块 npm install bcryptjs --save 2.在需要加密的模块中引入bcryptjs库    require('bcryptjs');   实战 : /** ...

  3. poker2的配置使用

    1.映射Win键的诸多功能 切换输入法,shift+alt本身已经支持了,所以Win+Space就不管了 Win+Space映射为Fn+Space Win+E映射为Fn+E Win+R映射为Fn+R ...

  4. python 输出六行星号✳

    for i in range(1,6): for j in range(5-i): print(" ",end=" ") for j in range(1,2* ...

  5. STL--迭代器设计原则和萃取机制(Traits)

    title: C++ STL迭代器设计原则和萃取机制(Traits) date: 2019-12-23 15:21:47 tags: STL C/C++ categories: STL 迭代器 (it ...

  6. 九十二、SAP中ALV事件之六,复制一个标准工具栏到自己的程序

    一.我们来到SE41,点击复制状态按钮 二.点击复制状态后,弹出一个框框,上面是模板内容,下面是我们自己的程序 三.我们根据上一篇的标准模板内容,填好相应的模板和我们的程序的内容 三.点击复制按钮 五 ...

  7. 三十六、SAP的调试模式

    一.在执行界面,输入/h, 左下角会提示调试模式被激活 二.点击运行,就会跳出调试界面 三.调试界面用法

  8. 7. 单机版Redis的安装以及Redis生产环境启动方案

    安装单机版redis redis的生产环境启动方案redis cli的使用 1. 安装单机版redis 大家可以自己去官网下载,当然也可以用课程提供的压缩包 wget http://downloads ...

  9. 实验吧-密码学-变异凯撒(ascii码规律运算)

    密文是:afZ_r9VYfScOeO_UL^RWUc 刚开始很迷,不知道往什么方向,到最后才发现,原来和ASCII有关. 将flag{的ASCII码和密文的ASCII码对比: 97 102 90 95 ...

  10. Spring 事件(2)- 自定义事件

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...