【题目背景:】

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. [SDOI2010] 外星千足虫

    Description 公元2089年6月4日,在经历了17年零3个月的漫长旅行后,"格纳格鲁一号"载人火箭返回舱终于安全着陆.此枚火箭由美国国家航空航天局(NASA)研制发射,行 ...

  2. 翻译:CREATE PROCEDURE语句(已提交到MariaDB官方手册)

    本文为mariadb官方手册:CREATE PROCEDURE的译文. 原文:https://mariadb.com/kb/en/create-procedure/我提交到MariaDB官方手册的译文 ...

  3. 清除电脑垃圾.bat

    echo.title delete cachecolor 0aecho.echo please enter any key start.....@echo offecho execuing delet ...

  4. 使用Nexus2.x为Maven3.x搭建私服构件仓库

    前言 在笔者的前一篇博文<Use Maven3.x>中,笔者详细的讲解了如何通过使用Maven3.x来构建及管理你的项目.其中笔者提到过些关于私服的概念,但却没有明确的对私服做出详细的阐述 ...

  5. 聚簇索引(聚集索引) 不可作用于GUID类型字段

    聚簇索引(又名聚集索引) 不可作用于GUID类型字段,即:数据库中不要把GUID类型作为主键或设置为聚集索引. 聚集索引:索引的物理存储顺序与数据表中行数据物理存储顺序一致(索引存储物理有序). 非聚 ...

  6. 性能监控(5)–JAVA下的jstat命令

    jstat的基本语法为 Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [& ...

  7. Python全栈学习_day001知识点

    今日大纲: . 变量. ***** . 常量.** . 注释.*** . 基础数据类型初识(int,str,bool). ***** . 用户输入 input ***** . 流程控制语句if. ** ...

  8. 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)

    10折交叉验证 我们构建一个分类器,输入为运动员的身高.体重,输出为其从事的体育项目-体操.田径或篮球. 一旦构建了分类器,我们就可能有兴趣回答类似下述的问题: . 该分类器的精确率怎么样? . 该分 ...

  9. 洛谷P2572 [SCOI2010]序列操作(ODT)

    题解 题意 题目链接 Sol ODT板子题..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long l ...

  10. javascript arguments参数问题

    function f(a, b, c){ alert(arguments.length); // result: "2" a = 100; alert(arguments[0]); ...