博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1190生日蛋糕[DFS 剪枝]
阅读量:6444 次
发布时间:2019-06-23

本文共 1420 字,大约阅读时间需要 4 分钟。

生日蛋糕
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 18236   Accepted: 6497

Description

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

1002

Sample Output

68

Hint

圆柱公式 
体积V = πR
2
侧面积A' = 2πRH 
底面积A = πR
2 

Source


一开始想的是从上往下搜,可以用A*的估价函数剪枝(因为下面的r和h都比上面的大)
然而题解都是递推了mnv[]和mns[]然后用他们从下往上搜
比较神的一个剪枝是2*(n-v)/lr+s>ans
2*(n-v)/lr这块是剩下的体积所能围成图形面积下限,因为推导一下可知圆柱v不变,侧面积与r成反比
还有h的范围,mxh=min(lh-1,(n-mnv[d-1]-v)/(tr*tr));
 
#include 
#include
#include
#include
#include
using namespace std;const int N=20;int n,m,ans=1e9;int mnv[N],mns[N];void init(){ for(int i=1;i<=m;i++){ mnv[i]=mnv[i-1]+i*i*i; mns[i]=mns[i-1]+2*i*i; }}void dfs(int d,int lh,int lr,int s,int v){ if(d==0){ if(v==n&&s
n||s+mns[d]>ans) return; if(2*(n-v)/lr+s>ans) return; for(int tr=lr-1;tr>=d;tr--){ if(d==m) s=tr*tr; int mxh=min(lh-1,(n-mnv[d-1]-v)/(tr*tr)); for(int th=mxh;th>=d;th--){ dfs(d-1,th,tr,s+2*th*tr,v+tr*tr*th); } }}int main(){ scanf("%d%d",&n,&m); init(); dfs(m,n-mnv[m-1],sqrt(n-mnv[m-1])+1,0,0); printf("%d",ans);}

 

 
 

转载地址:http://idpwo.baihongyu.com/

你可能感兴趣的文章
Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
查看>>
【CT】四、Turing Machines(2)
查看>>
【matlab】plot
查看>>
Kafka生产者APi
查看>>
有关计算机组成的分享~
查看>>
梳理回顾
查看>>
基于开源Dubbo分布式RPC服务框架的部署整合
查看>>
用C#实现智能设备上的NotifyIcon类
查看>>
HDU-2602-Bone Collector
查看>>
vs 2017 IIS EXPRESS 增加局域网访问
查看>>
POJ-2456 Aggressive cows---最大化最小值(也就是求最大值)
查看>>
解决WinSock中发送、接收多包问题
查看>>
CMDB资产管理系统开发:需求分析
查看>>
WebKit源代码里的RefPtr智能指针
查看>>
前端异常采集
查看>>
hadoop day 5
查看>>
mount什么意思
查看>>
c++-链表的回文结构
查看>>
XML模块
查看>>
编写自动化测试用例的原则
查看>>