【题解】生日蛋糕-C++
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++的更多相关文章
- 生日蛋糕 (codevs 1710) 题解
[问题描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri,高度为Hi的圆柱 ...
- 题解 P1731 【生日蛋糕】
题面传送门 如果不懂DFS,请自觉睡觉: 如果不懂剪枝,请自觉睡觉: 啊哈,大家的思路一定和我一样--DFS,找个数组存储半径和高,可是如单单使用DFS不加剪枝的话,10分--20分. 所以,我们来想 ...
- 【题解】 [NOI1999]生日蛋糕
题面 传送门 Solution 搜索每一层的半径和高度,然后加入一些剪枝就好了. #include<stdio.h> #include<stdlib.h> #include&l ...
- 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)
洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...
- 洛谷 P1731 [NOI1999]生日蛋糕 题解
每日一题 day53 打卡 Analysis 观察一个蛋糕的俯视图,上表面的面积其实就是最下面那一层的底面积,所以在第一次搜索的时候加入这个底面积,之后就只用考虑侧面积就好啦. 就是每次枚举r和h,如 ...
- luogu1731生日蛋糕题解--恶心剪枝
题目链接 https://www.luogu.org/problemnew/show/P1731 分析 这题真[哔]恶心,加了一堆奇奇怪怪的优化 首先明确一点,半径和高都必须是正整数,意味着它们最小为 ...
- 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>
题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...
- 题解 NOI1999【生日蛋糕】—— 洛谷
自己想出这题的大佬蒟蒻在这儿%您了 我实在是太弱了,搜索这种辣鸡算法都不会(逃 这题真的是想了好久,每次都会T三个点,我以为我的剪枝已经堆了够多了,结果后来才知道是一个关键剪枝没想到OTZ 先贴代码 ...
- POJ 1190 生日蛋糕题解
题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...
随机推荐
- 在Delphi中静态调用DLL
在Delphi中静态调用DLL top 调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. u ...
- WP8.1使用HttpClient类
Uri uri = new Uri("http://www.cnsos.net/weburl/index.htm", UriKind.Absolute); HttpClient m ...
- UWP入门(九)-- 枚举和查询文件和文件夹
原文:UWP入门(九)-- 枚举和查询文件和文件夹 核心 API 所在的命名空间: Windows.Storage Windows.Storage.Streams Windows.Storage.Pi ...
- JS获取a标签的Href 内容
<script type="text/javascript">function getHref(obj){ alert(obj.href);} </script& ...
- uniDAC使用sqlite3作为 IOS APP 的数据库存在的问题
前面有写,可以利用uniConnection的ForceCreateDatabase参数,强制建立sqlite本地数据库, uniConnection1.SpecificOptions.Values[ ...
- RocketMQ配置
安装&配置 1.Clone&Build git clone -b develop https://github.com/apache/incubator-rocketmq.git cd ...
- Qt5---ftp上传功能(可直接克隆某个小模块,查看QT下FTP的socket原理)
http://blog.csdn.net/freeape/article/details/52802163
- TDD(测试驱动开发)死了吗?
01.前言 很早之前,曾在网络上见到过 TDD 这 3 个大写的英文字母,它是 Test Driven Development 这三个单词的缩写,也就是“测试驱动开发”的意思——听起来很不错的一种理念 ...
- Spring之ApplicationContext
(1)ApplicationContext接口容器 ApplicationContext用于加载Spring的配置文件,在程序中充当“容器”的角色.其实现类有两个.通过Ctrl +T查看: A.配置文 ...
- python实现常用查找算法
http://www.cnblogs.com/feixuelove1009/p/6148357.html