生日蛋糕

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。

设从下往上数第i层蛋糕是半径为Ri, 高度为Hi的圆柱。

当i < M时,要求Ri > Ri+1且Hi > Hi+1。

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

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

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

输入格式
输入包含两行,第一行为整数N(N <= 10000),表示待制作的蛋糕的体积为Nπ。

第二行为整数M(M <= 20),表示蛋糕的层数为M。

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

数据范围
1≤N≤10000,
1≤M≤20
输入样例:
100
2
输出样例:
68

本题的思想是dfs搜索,难点是剪枝:

注意我们的蛋糕编号是由上向下进行编号的。

(1):从底层开始向上遍历,即由题意得底层的半径和高度都大于上层,这样先把较大的体积进行分配,可以剪枝。

(2):在搜索之前我们预处理每一层能积累的最小的体积和面积,即第一个(编号)蛋糕半径和高度都为1,第二个都为2,第i个都为i;然后我们每次搜索当前已经有的体积和面积加上最小值之后不能超过我们的设定值。

另外我们当前蛋糕的剩余体积已知:s=2Πrrh/r,且我们当前半径的最大值就等于上一个蛋糕的半径(取不到只是趋向于),我们还可以由此判断当前面积是否符合情况。

(3)然后就是循环遍历我们每层的半径和高度,由于二者都未知,我们先循环遍历半径,因为半径的影响是乘方的。二者的遍历范围在程序中注释出来了。

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=25,INF=1e9;
int R[N],H[N];//动态存储每一层蛋糕的半径和高
int minv[N],mins[N];
//存储每一层积累的最小的体积和面积,用于剪枝
int n,m;
int ans=INF;
void dfs(int u,int v,int s)
{//当前为第u个蛋糕(从上往下数),总共积累的体积v,总共积累的面积sif(s+mins[u]>=ans)return;//当目前积累的最小面积大于等于搜索中最小的面积时,进行剪枝,返回if(v+minv[u]>n)return;//同上超过题目要求体积时,进行剪枝if(s+2*(n-v)/R[u+1]>=ans)return;//当前的蛋糕半径一定小于上一个蛋糕的半径,即上一个蛋糕的半径相当于当前蛋糕半径的最大值//由:s=2*Π*r*r*h/r,当前体积是确定的,当半径趋于最大值,面积趋于最小值//即当当前积累面积最小值大于搜索中的最小面积时,进行剪枝if(!u){//当遍历到最高层蛋糕,且体积完全分配时,更新最小面积if(v==n)ans=s;return;}for(int r=min(R[u+1]-1,(int)sqrt(n-v));r>=u;r--)for(int h=min(H[u+1]-1,(n-v)/r/r);h>=u;h--){//半径的遍历应至少小于上一个蛋糕的半径,并且由v=Πr*r*h,当h取最小值时,r取最大值//所以当前遍历半径应同时小于上边两个值,此时保证的时半径的最大值//最小值不能小于当前蛋糕的编号//在已经确定半径的遍历后,高度的最大值应即小于上一个蛋糕,v=Πr*r*h,且小于确定了半径的高度//最大值同上int t=0;if(u==m)t=r*r;//当当前编号为m即底层蛋糕时,记录上表面积H[u]=h;R[u]=r;dfs(u-1,v+r*r*h,s+2*r*h+t);}
}
int main()
{cin>>n>>m;for(int i=1;i<=m;i++){//求每一层的最小的体积和面积时,即第一层半径和高:1、1//第二层半径和高:2、2……第i层:i、iminv[i]=minv[i-1]+i*i*i;mins[i]=mins[i-1]+2*i*i;}R[m+1]=H[m+1]=INF;//边界赋最大值dfs(m,0,0);//从底层还是搜索,也是一种剪枝if(ans==INF)ans=0;cout<<ans<<endl;return 0;
}

《算法竞赛进阶指南》生日蛋糕相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  2. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  3. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  4. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  5. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  6. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  7. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  8. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  9. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

  10. 算法竞赛进阶指南0x3A 博弈论之SG函数

    算法竞赛进阶指南0x3A 博弈论之SG函数

最新文章

  1. 逃课上网吧编程、玩摇滚的另类学生,如何成为独角兽公司的 CTO?
  2. 【转】iOS开发24:使用SQLite3存储和读取数据
  3. qrcodejs2--Vue生成二维码组件封装
  4. Pandas实用技能,将列(column)排序的几种方法
  5. 2016 server sql 错误53_MS SQL Server 错误53 错误17是什么?如何解决
  6. python 加密解密_python加密解密
  7. Oracle:ORA-28000异常(帐户已被锁定),修改账号登录失败次数
  8. pythonint函数的参数_向嵌入的Python函数传递两个参数(int和array)
  9. 【了解链表的适用场景;掌握单向链表、双向链表的使用】(学习笔记18--链表)
  10. hanlp和jieba等六大中文分工具的测试对比
  11. 【MySQL学习笔记】MySQL库与表
  12. 软件测试项目实战(web+app+h5+小程序)
  13. autoshape很多 excel_怎样清除excle中Autoshape_ExceL批注属性批量修改宏代码�9�3
  14. python的字符串的使用
  15. C++ 函数的递归调用
  16. Rust学习日记番外篇——代码写诗
  17. Windows键失灵的三种处理方式
  18. 基础理论—需求定律与供给定律分析…
  19. Rings(思维/贪心)
  20. 如何在 Pandas DataFrame 中插入一行

热门文章

  1. (毕业设计资料)基于单片机SPWM逆变器电源系统设计
  2. 现代软件工程_团队项目_阿尔法阶段_需求分析文档_2017.11.13
  3. Python零基础入门之第一章(一、基本输入和输出)
  4. PWM调节输出可控直流电压
  5. 2021年中国SUV产销量分析:销量达1010.1万辆,占汽车总销量的38.44%[图]
  6. OpenERP API 接口
  7. 2018上半年信息系统项目管理师真题
  8. 每天学点SpringCloud(四):Feign的使用及自定义配置
  9. 电商后台管理系统添加编辑和删除商品分类
  10. USB外接电源与锂电池自动切换电路设计