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
100
2
Sample Output
68
HINT
圆柱公式

体积V = πR^2H

侧面积A’ = 2πRH

底面积A = πR^2


这道题目主要考察的是DFS的剪枝,注释已经打在代码里了,再看不懂我也没办法。
思路:
从第一层到第m层从上自下考虑,每次拓展第dep层的h和r,然后核心语句(极大化剪枝)

if(s+2*i*j+back[dep+1]>=ans)break;//极大化剪枝

back是底面积的后缀和数组:

for(int i=m;i>=1;i--)
{
back[i]=back[i+1]+2*(m-i+1)*(m-i+1);
}

下面是代码,注释很详细了,第一篇写了这么多注释的代码, 就别抄了a.a

 /*
①m-dep+1:这个意思是还剩下未考虑的蛋糕层数,同时也代表着第dep层最小的高和半径
②sqrt(n-v):因为n-v是剩下的体积,开根号之后就接近于r,h越大误差越大,这样能够有效地提高代码循环效率
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,h[],r[];//h[i]=第i层蛋糕的高,r[i]=第i层蛋糕的半径
int back[];//底面积后缀和数组,因为实在不知道取什么名字干脆就这样了
void dfs(int dep,int s/*表面积*/,int v/*体积*/)
{
if(dep==m+)
{
if(v==n)ans=min(ans,s);
return ;
}
int u=min(int(double(sqrt(n-v))/*②*/),r[dep-]-);
for(int i=u;i>=(m-dep+)/*①*/;i--)
{
if(*(n-v)/i+s>=ans)continue;
for(int j=(m-dep+);j<=min((n-v)/(i*i),h[dep-]-);j++)
{
if(s+*i*j+back[dep+]>=ans)break;//极大化剪枝
if(v+i*i*j>n)break;//不合法情况剪枝
r[dep]=i;h[dep]=j;
if(dep!=)dfs(dep+,s+*i*j,v+i*i*j);
else dfs(dep+,s+*i*j+i*i,v+i*i*j);//因为dep为1的时候传进来的s是0,计算是毒瘤(划去)
r[dep]=;h[dep]=;//回溯
}
}
}
int main()
{
cin>>n>>m;
for(int i=m;i>=;i--)
{
back[i]=back[i+]+*(m-i+)*(m-i+);
}
ans=0x3f3f3f3f;r[]=h[]=0x3f3f3f3f;
dfs(,,);
if(ans==0x3f3f3f3f)
cout<<<<endl;//判断特殊情况
else cout<<ans<<endl;
return ;
}

ov.

最新文章

  1. Sublime Text3 以及 SublimeREPL使用Virtualenv执行python
  2. 什么是viewport,为什么需要viewport
  3. Python 练习册
  4. 日志分析 第四章 安装filebeat
  5. CacheManagerUtils.java
  6. destoon短信接口修改方法
  7. Qt的quit(),exit()以及close()事件捕获
  8. CSS背景属性Background详解
  9. ajax success 和complete 的区别
  10. 使用异步任务加载网络上json数据并加载到ListView中
  11. 练习题之ThreadLocal
  12. js 对象 视频 插入元素
  13. python continue的应用
  14. ubuntu安装带调试功能的bochs
  15. 欣赏&lt;沉默的大多数&gt;——王小波
  16. XtraDB/InnoDB的文件格式(已提交到MariaDB官方手册)
  17. Nginx IP地址透传
  18. Docker:从引擎和运行框架理解Docker(3)
  19. Git服务器的搭建和使用
  20. Ubantu MySQL数据库操作

热门文章

  1. VS2010调试X86汇编程序
  2. tf.nn.softmax &amp; tf.nn.reduce_sum &amp; tf.nn.softmax_cross_entropy_with_logits
  3. Hadoop中重要概念简要总结
  4. ML:吴恩达 机器学习 课程笔记(Week1~2)
  5. VC 使用msxml6.dll动态链接库中的函数读写XML文件
  6. string与QString转换(string既可以是utf8,也可以是gbk)
  7. PC-lint 简明教程(C/C++静态代码检查工具)
  8. redis的下载及使用
  9. 关于Git 的管理凭据操作
  10. asp.net core 系列之Startup