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.

【题解】生日蛋糕-C++的更多相关文章

  1. 生日蛋糕 (codevs 1710) 题解

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

  2. 题解 P1731 【生日蛋糕】

    题面传送门 如果不懂DFS,请自觉睡觉: 如果不懂剪枝,请自觉睡觉: 啊哈,大家的思路一定和我一样--DFS,找个数组存储半径和高,可是如单单使用DFS不加剪枝的话,10分--20分. 所以,我们来想 ...

  3. 【题解】 [NOI1999]生日蛋糕

    题面 传送门 Solution 搜索每一层的半径和高度,然后加入一些剪枝就好了. #include<stdio.h> #include<stdlib.h> #include&l ...

  4. 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)

    洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...

  5. 洛谷 P1731 [NOI1999]生日蛋糕 题解

    每日一题 day53 打卡 Analysis 观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦. 就是每次枚举r和h,如 ...

  6. luogu1731生日蛋糕题解--恶心剪枝

    题目链接 https://www.luogu.org/problemnew/show/P1731 分析 这题真[哔]恶心,加了一堆奇奇怪怪的优化 首先明确一点,半径和高都必须是正整数,意味着它们最小为 ...

  7. 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  8. 题解 NOI1999【生日蛋糕】—— 洛谷

    自己想出这题的大佬蒟蒻在这儿%您了 我实在是太弱了,搜索这种辣鸡算法都不会(逃 这题真的是想了好久,每次都会T三个点,我以为我的剪枝已经堆了够多了,结果后来才知道是一个关键剪枝没想到OTZ 先贴代码 ...

  9. POJ 1190 生日蛋糕题解

    题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...

随机推荐

  1. 了解 XML 数字签名

    http://www.cnblogs.com/flyxing/articles/91734.html http://www.cnblogs.com/wuhong/archive/2010/12/20/ ...

  2. C# Insert批量插入

    最近项目需要做一个批量导入的功能,每次导入最少的记录数都达到1万,之前写了一个通过循环Insert的方法,结果我自己都看不下了.太慢了,所以用了SqlBulkCopy,很快,100万条数据,1分钟都不 ...

  3. 基于事件驱动的DDD领域驱动设计框架分享(附源代码)

    原文:基于事件驱动的DDD领域驱动设计框架分享(附源代码) 补充:现在再回过头来看这篇文章,感觉当初自己偏激了,呵呵.不过没有以前的我,怎么会有现在的我和现在的enode框架呢?发现自己进步了真好! ...

  4. GitLab一键式安装bitnami 专题

    git lab developer角色不能提交到master分支的问题 错误提示: git -c diff.mnemonicprefix=false -c core.quotepath=false p ...

  5. 转换GMT秒数为日期时间格式-Delphi源码

    转换GMT秒数为日期时间格式-Delphi源码.收藏最近在写PE分析工具的时候,需要转换TimeDateStamp字段值为日期时间格式,这是Delphi的源码. //把GMT时间的秒数转换成日期时间格 ...

  6. Azure 云助手主要功能

    实时查询: 实时查询Azure云服务的用量和账单,还可以将重点服务固定在首页“我的监控”页面,方便快速查看. 随时管控: 随时随地对云服务管理和配置(例如,重启.更改虚拟机). 多个账户: 随心切换多 ...

  7. Codility----PassingCars

    Task description A non-empty zero-indexed array A consisting of N integers is given. The consecutive ...

  8. 文件夹管理工具(MVC+zTree+layer)

    文件夹管理工具(MVC+zTree+layer)(附源码)   写在前 之前写了一篇关于 文件夹与文件的操作的文章  操作文件方法简单总结(File,Directory,StreamReader,St ...

  9. spring boot自定义配置文件

    把一些可能会经常变动的东西写在配置文件中,可以增加程序的灵活性,避免多次改版发版. 在sping boot中除了自带的默认配置文件application.properties之外,我们还可以在reso ...

  10. 浅谈我在.net core一年里的收获

    前言:以前一直在winserver的环境里从事web工作,安装一个sqlserver,iis,把项目部署上面就OK了,简单轻松一.结缘nginx以前一直听说nginx这个反向代理的web服务器,当玩n ...