7月17日是mr.w的生日,acm-thu為此要製作乙個體積為nπ的m層生日蛋糕,每層都是乙個圓柱體。
設從下往上數第i(1<=i<=m)層蛋糕是半徑為ri,高度為hi的圓柱。當i時,要求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)。
100
2附:圓柱公式
體積v=πr^2h
側面積a』=2πrh
底面積a=πr^2
[noi1999]
數學,搜尋,剪枝
(這道題之前做過,所以再一次做起來比較快)用dfs來確定每一層蛋糕,dfs要記錄當前蛋糕層數,半徑,高,已有的外表面積,剩下的蛋糕體積,列舉下一層蛋糕的半徑和高,然後用dfs確定合不合理(即處於這種狀態時,最終得到的蛋糕外表面積可不可以用來更新ans);dfs中有3個優秀的剪枝,十分有用:1:如果最小情況大與已有ans,則再深搜搜出的答案也不能更新ans,所以跳出;2:如果將剩下層數堆完所需要的最小體積大於還剩下的體積,那麼蛋糕不夠用,所以跳出;
3:如果將剩下層數堆完所需要的最大體積小於還剩下的體積,那麼蛋糕用不完,所以跳出
#include
#include
#include
#include
using
namespace
std;
int n,m,ans;
int mmin(int i)//找到堆完剩下層數的蛋糕所需蛋糕體積的最小值
int mmax(int i,int r,int h)//找到堆完剩下層數的蛋糕所需蛋糕體積的最大值
inline
void dfs(int i,int r,int h,int s,int v)//i 當前層數,r當前層的半徑,h當前層的高,s已有的外表面面積,v剩下的體積
if (s+2*v/r>ans) return;//如果最小情況大與已有ans,則再深搜搜出的答案也不能更新ans,所以跳出
if (mmin(i)>v) return;//如果將剩下層數堆完所需要的最小體積大於還剩下的體積,那麼蛋糕不夠用,所以跳出
if (mmax(i,r,h)return;//如果將剩下層數堆完所需要的最大體積小於還剩下的體積,那麼蛋糕用不完,所以跳出
//上面三個if是十分重要的三個剪枝,比較巧妙
for (int r=r-1;r>=1;r--)//列舉下一層蛋糕的半徑
for (int h=h-1;h>=1;h--)//列舉下一層蛋糕的高
dfs(i+1,r,h,s+2*r*h,v-r*r*h);//深搜下一層
}int main()
嗯,體現了剪枝的厲害的生日蛋糕 NOI1999 poj1191 棋盤分割
description 將乙個 的棋盤進行如下分割 將原棋盤割下一塊矩形棋盤並使剩下部分也是矩形,再將剩下的部分繼續如此分割,這樣割了 n 1 次後,連同最後剩下的矩形棋盤共有n塊矩形棋盤。每次切割都只能沿著棋盤格仔的邊進行 原棋盤上每一格有乙個分值,一塊矩形棋盤的總分為其所含各格分值之和。現在需要...
noi 1999 生日蛋糕
題目描述 4月16日是nanae的生日,josnch為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下...
NOI1999 生日蛋糕
noi1999 生日蛋糕 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 ...