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

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

令Q = Sπ

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

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

Input

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

Output

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

Sample Input

100
2

Sample Output

68

Hint

圆柱公式
体积V = πR
2H

侧面积A' = 2πRH

底面积A = πR
2
 
思路:正常深搜,但是会TLE,需要众多剪枝
①我们可以预处理1~当前层所需的最小表面积和体积,然后如果已经选的表面积(体积)+ 剩下最小表面积(体积)超过ans(N规定体积)就return
②枚举r,h时,我们可以知道规定枚举范围,就不需要每次减一递减
maxR = min(r,sqrt(N-SumV-minV[now-1])
maxH = min(h,(n-SumV-minV[now-1])/(i*i))
③最难的一个剪枝:
n-SumV = Σh【k】*r【k】*r【k】   (1<=k<=now)               
2*Σr【k】*h【k】= 2/r【now+1】*Σr【k】*h【k】*r【now+1】 >=  2/r【now+1】*Σh【k】*r【k】*r【k】(1<=k<=now)
2*Σr【k】*h【k】 >= 2*(n-SumV)/r【now+1】  (1 <= k <= n)
所以 SumS + = 2*(n-SumV)/r【now+1】 >= ans 就return
因为当前dfs的r,h是本次选择的时候的边界,所以加个last变量记录r【now+1】即上次选择的半径r
 
#include<cstdio>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std; int n,m,ans;
int minV[];
int minS[];
void dfs(int now,int SumS,int SumV,int r,int h,int last)
{
if(SumS + minS[now] > ans)
return;
if(SumV + minV[now] > n)
return;
if(SumS + *(n-SumV)/last >= ans)
return;
if(!now)
{
if(SumV == n && SumS < ans)
ans = SumS;
return;
}
int maxR = min(r,(int)sqrt(n-SumV-minV[now-]));
for(int i=maxR;i>=now;i--)
{
if(now == m)SumS = i*i;
int maxH = min((n-minV[now-]-SumV)/(i*i), h);
for(int j=maxH;j>=now;j--)
{
dfs(now-,SumS+*i*j,SumV+i*i*j,i-,j-,r);
}
}
} int main()
{
ans = 0x3f3f3f3f;
for(int i=; i<=; i++)
{
minV[i] += minV[i-] + i*i*i;
minS[i] += minS[i-] + *i*i;
}
scanf("%d%d",&n,&m);
dfs(m,,,,,);
if(ans == 0x3f3f3f3f)ans = ;
printf("%d\n",ans);
}
 
 
 

生日蛋糕 POJ - 1190 (搜索+剪枝)的更多相关文章

  1. 生日蛋糕 POJ - 1190 搜索 数学

    http://poj.org/problem?id=1190 题解:四个剪枝. #define _CRT_SECURE_NO_WARNINGS #include<cstring> #inc ...

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

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

  3. poj 2531 搜索剪枝

    Network Saboteur Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u ...

  4. 生日蛋糕 POJ - 1190

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

  5. POJ 1190 生日蛋糕 【DFS + 极限剪枝】

    题目传送门:http://poj.org/problem?id=1190 参考剪枝:https://blog.csdn.net/nvfumayx/article/details/6653111 生日蛋 ...

  6. poj 1190 DFS 不等式放缩进行剪枝

    F - (例题)不等式放缩 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submi ...

  7. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  8. 【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move

    poj  1568:Find the Winning Move   [迭代博弈+搜索+剪枝] 题面省略... Input The input contains one or more test cas ...

  9. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

随机推荐

  1. 关于 IOS 时间的一下用法

    1. 加减月份 -(NSDate *)getPriousorLaterDateFromDate:(NSDate *)date withMonth:(int)month {     NSDateComp ...

  2. Confluence 6 使用 Decorator 宏

    Decorator 宏(Macros)是 Velocity  宏.这个宏可以被用来在页面编辑 Custom decorators 中创建复杂或者可变的部分,例如菜单,页面其他部分等.Decorator ...

  3. ios消息机制

    ios消息机制介绍 ios 调用每一个方法的时候其实是走的ios的消息机制 举例介绍一下 创建一个Pserson类 有一个eat 对象方法 那么下面的代码可以用消息机制实现  导入消息头文件    # ...

  4. bat如何实现自动创建文件夹(以当前时间命名)

    先比较直接的查看当前的日期和时间:(或者cmd中直接输入date,time查看) @echo off color 0a set dt=%date%%time% echo %dt% pause 1.使用 ...

  5. ActiveMQ消息的持久化策略

    持久化消息和非持久化消息的存储原理: 正常情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的.能够存储的最大消息数据在${ActiveMQ_HOME}/conf/activemq.xml ...

  6. 【ssh】端口转发

    来源:https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 非常非常好用,可以通过跳板解决两台服务器无法连接的问题 第一部分 概述 ...

  7. Win#password;;processon #clone;;disassemble;;source find

    1.密码学思维导图 源地址:https://www.processon.com/view/5a61d825e4b0c090524f5b8b 在这之前给大家分享 如何在 processon上搜索公开克隆 ...

  8. Centos6.10部署TeamViewer

    1.在官网下载支持Linux系统的包,建议下载TeamViewer12的包,官网URL:https://www.teamviewer.com/cn/download/linux/ 2.将下载的软件包导 ...

  9. python面向对象三大特性之继承

    继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...

  10. HDU 3336 Count the string(next数组运用)

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...