【题目背景:】

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。

【题目描述:】

设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri, 高度为Hi的圆柱。当i<M时,要求 \(R_i > R_{i+1}\) 且 $H_i>H_{i+1}H $。

由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。

令Q= Sπ

请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小。

(除Q外,以上所有数据皆为正整数)

【输入格式:】

有两行,第一行为N(N<=20000),表示待制作的蛋糕的体积为Nπ;第二行为M(M<=15),表示蛋糕的层数为M。

【输出格式:】

仅一行,是一个正整数S(若无解则S=0)。





[算法分析:]

就是搜索啊搜索啊搜索,但是要剪枝啊剪枝啊剪枝啊

像我这么弱连这道题的搜索都要调试的人应该是没有几个了..

观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦.

就是每次枚举r和h,如何选取上下界呢?

将上一层的高度记作lh,上一层的半径记作lr,则上界很好判断,就是\(lh-1\)和\(lr-1\),

底层应该是选取\(\sqrt[3]{20000}\)约为28的范围

现在考虑下界:

自然选取1是会T得很惨的,下界就是最小值嘛,最上面一层的\(r\)和\(h\)的最小值都是\(1\)啊,那还有几层下界就是几啦!

然后来愉快地剪枝:

比较好想的剪枝是这两个:

  1. 当当前的面积总和已经超过之前的答案时,\(return\)

  2. 当当前体积超过了要求的体积时,\(return\)

还有一些剪枝,思维难度也不算高:

  • 当现在的已有体积加上之后的最大(并不是真正的最大,会比最大还要大一些)体还要小于要求的体积时,\(return\)

  • 当当前的已有面积加上之后的最小(自然也是比真正的最小还要小一些)面积比已有答案还要大时,\(return\)

关于搜索顺序的选择:

这个东西..就是一个玄学...一共有\(A_2^2\ A_2^2\)种选择自己试试就好啦(雾





\([Code:]\)

#include<iostream>
#include<cstdio>
#define re register
using namespace std; int ans = 2e9;
int n, m; void dfs(int t, int s, int v, int lr, int lh) {
if(s >= ans) return;
if(t == m+1 && v == n) {
ans = min(ans, s);
return;
}
if(v >= n) return;
int k = m - t + 1;
if(k * lr * lr * lh + v < n) return;
if(k * 2 + s > ans) return;
if(t == 1) {
for(re int r=lr; r>=m; --r) {
for(re int h=m; h<=lh; ++h) {
dfs(t + 1, s + r * r + 2 * r * h, v + r * r * h, r, h);
}
}
}
else for(re int r=lr-1; r>=m-t+1; --r) {
for(re int h=m-t+1; h<lh; ++h) {
dfs(t + 1, s + 2 * r * h, v + r * r * h, r, h);
}
}
} int main() {
scanf("%d%d", &n, &m);
dfs(1, 0, 0, 28, 28);
if(ans == 2e9) puts("0");
else printf("%d\n", ans);
}

【洛谷】【搜索+剪枝】P1731 [NOI1999]生日蛋糕的更多相关文章

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

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

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

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

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

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

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

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

  5. 洛谷 P1731 [NOI1999]生日蛋糕 && POJ 1190 生日蛋糕

    题目传送门(洛谷)  OR 题目传送门(POJ) 解题思路: 一道搜索题,暴力思路比较容易想出来,但是这道题不剪枝肯定会TLE.所以这道题难点在于如何剪枝. 1.如果当前状态答案已经比我们以前某个状态 ...

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

    题目 搜索+剪枝,主要考察细节和搜索的顺序,首先可以发现所有数据均为整数,所以初始化每层的蛋糕R和H是整数,然后从高层向低层搜索,然后预处理出各层向低层的最小面积和体积用来剪枝. 就可以每层从当前最大 ...

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

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

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

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

  9. POJ1190 洛谷P1731 NOI1999 生日蛋糕

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

随机推荐

  1. 阿里云服务器 Mysql数据库的安装和使用

    为了做服务迁移,mysql的安装总是不那么顺利, 教程很多, 但都不能够一蹴而就, 所以,单独总结一篇, 当然也借鉴了一些前辈的经验. ================================ ...

  2. 基于Asp.Net Core 2.1的简单问答社区系统源代码分享

    看见园子里很多人都在分享源代码,我也来凑个热闹. 该项目基于.NET CORE 2.1(其实是从1.1开始开发的),经历过不停的调整终于有个能拿出手的版本了,第一次在博客园发文章. 使用到的技术以及框 ...

  3. css布局------左边宽度不定,右边宽度自动填满剩余空间

    HTML <div class="container"> <div class="left"></div> <div ...

  4. SQL 游标的存储过程示例

    注意事项:两个小数运算的时候都是一种类型! USE [FoodMedicineExam] GO /****** Object: StoredProcedure [dbo].[P_DrugExamAna ...

  5. js 去掉缓存的几种方式

    1.在Ajax发送请求前加上 anyAjaxObj.setRequestHeader ("If-Modified-Since","0") 2.在Ajax发送请求 ...

  6. java连接OPC之——Windows7 With SP1 网络OPC的DCOM配置

    由于 OPC(OLE for Process Control)建立在 Microsoft 的 COM(COmponent Model)基础 上,并且 OPC 的远程通讯依赖 Microsoft 的 D ...

  7. 数据机构-折半查找法(二分查找法)-Python实现

    Python实现二分查找法(基于顺序表) class List: elem=[] #存储顺序表元素 last=-1 #设置初始为-1 SeqList = List() #创建一个顺序表 print(& ...

  8. JPA与EJB3的关系

    JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差异,它的出现在某种程度上能够解决目前ORM框架之间不能够兼容的问题,对开发人员来说,能够更好的在JPA规范下进行系统开发. JPA全称 ...

  9. 撩课-Java每天5道面试题第17天

    116.说下Struts的设计模式 MVC模式: web应用程序启动时 就会加载并初始化ActionServler. 用户提交表单时, 一个配置好的ActionForm对象被创建, 并被填入表单相应的 ...

  10. lfs(systemd版本)学习笔记-第4页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemd版本)学习笔记-第3页 的地址:https://www.cnblogs.com/renren-study- ...