2017 03 04 NOI1999 生日蛋糕

2021-07-27 20:29:59 字數 1536 閱讀 1916

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。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 ...