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

1 /*

2 ①m-dep+1:这个意思是还剩下未考虑的蛋糕层数,同时也代表着第dep层最小的高和半径3 ②sqrt(n-v):因为n-v是剩下的体积,开根号之后就接近于r,h越大误差越大,这样能够有效地提高代码循环效率4 */

5 #include

6 using namespacestd;7 int n,m,ans,h[10010],r[10010];//h[i]=第i层蛋糕的高,r[i]=第i层蛋糕的半径

8 int back[11000];//底面积后缀和数组,因为实在不知道取什么名字干脆就这样了

9 void dfs(int dep,int s/*表面积*/,int v/*体积*/)10 {11 if(dep==m+1)12 {13 if(v==n)ans=min(ans,s);14 return;15 }16 int u=min(int(double(sqrt(n-v))/*②*/),r[dep-1]-1);17 for(int i=u;i>=(m-dep+1)/*①*/;i--)18 {19 if(2*(n-v)/i+s>=ans)continue;20 for(int j=(m-dep+1);j<=min((n-v)/(i*i),h[dep-1]-1);j++)21 {22 if(s+2*i*j+back[dep+1]>=ans)break;//极大化剪枝

23 if(v+i*i*j>n)break;//不合法情况剪枝

24 r[dep]=i;h[dep]=j;25 if(dep!=1)dfs(dep+1,s+2*i*j,v+i*i*j);26 else dfs(dep+1,s+2*i*j+i*i,v+i*i*j);//因为dep为1的时候传进来的s是0,计算是毒瘤(划去)

27 r[dep]=0;h[dep]=0;//回溯

28 }29 }30 }31 intmain()32 {33 cin>>n>>m;34 for(int i=m;i>=1;i--)35 {36 back[i]=back[i+1]+2*(m-i+1)*(m-i+1);37 }38 ans=0x3f3f3f3f;r[0]=h[0]=0x3f3f3f3f;39 dfs(1,0,0);40 if(ans==0x3f3f3f3f)41 cout<<0<

42 else cout<

ov.

c++画蛋糕_【题解】生日蛋糕-C++相关推荐

  1. c++画蛋糕_为什么Golang能从Java和C++嘴里抢来一块蛋糕

    不得不说go的市场切入点非常准确 go被设计出来的目标应用场景是服务器开发,而服务器端开发是c++和java的地盘,占了大部分份额,go的目标是从他们嘴里抢蛋糕 程序员选语言除了流行度以外,语言是否好 ...

  2. python画蛋糕_python实现生日蛋糕

    蛋糕的由来: 某天在b站上看到某up主,用ipad手绘了一个蛋糕,当时觉得还不错,于是就想自己也画一个蛋糕出来.但奈何画画技术不行,于是就想到利用刚学完的python来实现.下面我来展示我的代码: A ...

  3. c++画蛋糕_【DFS练习】【最大的蛋糕块】-C++

    这道题目是一个基本的dfs模板(?)下面日常贴一波dfs的基本模板: void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意添加 return; } if(越界或者 ...

  4. 用python画漂亮的生日蛋糕_一步一步最简单的最漂亮的画蛋糕

    一步一步最简单的最漂亮的画蛋糕 生日蛋糕简笔画教程(一) 1.先画一个长方形 2.在大长方形上面画一个小点的长方形 3.在顶端画上蜡烛和火焰 4.在底部画上地盘 5.画一些长短不一的波浪线 6.上色, ...

  5. 如何用python画雪人_pygame画雪人_函数与图形示例.py

    """pygame画雪人_函数与图形示例.py """ # 导入pygame模块 import pygame def draw_snowma ...

  6. 用python画雪人-pygame画雪人_函数与图形示例.py

    """pygame画雪人_函数与图形示例.py """ # 导入pygame模块 import pygame def draw_snowma ...

  7. python画蛋糕玫瑰

    这里写目录标题 情人节蛋糕 前言 准备工作 python开发工具 turtle库 进行开发 1.引入相应的库及设置画布大小.背景色 2.画蛋糕 3.画玫瑰花 效果 情人节蛋糕 前言 盼望着盼望着,2. ...

  8. python画蛋糕祝福图片_蛋糕祝福语创意幽默 创意卡通生日蛋糕图片

    下文是蜜匠婚礼网精心整理的一篇关于蛋糕祝福语创意幽默以及创意卡通生日蛋糕图片,咱们一起来看看吧,希望对你有所帮助. 一.蛋糕祝福语创意幽默 1.今天是你的生日,我小心翼翼的记录我们点滴,庆幸我们走过的 ...

  9. python画蛋糕祝福图片大全_用Python的turtle模块画生日蛋糕

    import turtle as t import math as m import random as r t.speed(10) def drawX(a, i): angle = m.radian ...

最新文章

  1. NS_ASSUME_NONNULL_BEGIN 延伸
  2. Linux nethack
  3. Nginx —— nginx的命令行控制(nginx的启动与停止、重载配置文件、回滚日志文件、平滑升级等操作)
  4. iOS 仿通讯录索引
  5. asp.net webform 局部发布更新
  6. 跑来跑去:假人与AWS Lambda的第一次接触
  7. uni-app 微信小程序授权登录
  8. img src 本地图片_Java爬取简单的网页内容和图片
  9. 一个程序媛的3年华为之路
  10. 自定义控件之仿电话簿汉字排序侧边拼音
  11. 从Dijkstra谈帅才的洞察力(王选)
  12. Push rejected: Push to origin/master was rejected--git推送项目到远程服务器
  13. Android-ubuntu配置
  14. 【LINUX】LAMP概念与搭建
  15. IC入门记录(持续更新)
  16. Java判断用户是通过pc,还是安卓还是ios,还是微信客户端访问
  17. 洛谷 P1481 魔族密码
  18. ORA-39083:Object type TYPE failed to create with error:OID问题。
  19. 中职计算机专业英语ppt,计算机专业英语ppt
  20. cannot do a partial commit during a merge.

热门文章

  1. Kotlin 超车指南
  2. IMAS国际中小学数学竞赛考试详情
  3. Android图表库MPAndroidChart(九)——神神秘秘的散点图
  4. $listeners
  5. openwrt ec20 4g网卡使用
  6. 服务器可以用无线上网卡么,4G无线上网卡哪个好用 4g无线上网卡使用方法【详解】...
  7. 志汇同城-同城小程序8.6开源版源码赠送米花同城6.6.6+微同城模板
  8. 上架应用宝多次被拒总结
  9. cma认证办理流程,实验室cma认证条件
  10. TensorFlow tf.keras.losses.SparseCategoricalCrossentropy 、 categorical_crossentropy