POJ 1190 生日蛋糕

2021-08-28 15:59:17 字數 1644 閱讀 1580

poj 1190

生日蛋糕

time limit: 1000ms memory limit: 10000k

total submissions: 23271 accepted: 8320

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

1002sample output68

hint

圓柱公式

體積v = πr2h

側面積a』 = 2πrh

底面積a = πr2

重刷poj的第一題,經典搜尋之——生日蛋糕。

題意:求製作乙個m層,體積為v的蛋糕需要奶油的最小表面積,限制條件為:下面一層的半徑以及高度至少要比上一層的大1.

題解:用**dfs(int r 當前的半徑,int h當前的高度,int q當前的表面積,int deep當前的層數,int v當前的體積)**維護

值得深思的是,用dfs搜尋必須要有乙個極限,那麼r的極限是什麼?h的極限是什麼?

我們不妨假設整個蛋糕只有乙個圓柱,因為體積最大為10000,所以如果其高度為1,那麼r最大為100;如果其半徑為1,那麼高度最大為10000;

那麼就可以有如下的**:

dfs(100,10000,0,m,0);
int dfs(int r,int h,int q,int deep,int v)

}}

這樣還不行,我們還需要考慮剪枝

從下往上列舉;

當deep<0時return;

當 當前體積大於n,return;

當 當前表面積大於ans;return;

當 就算剩下的層數取最大體積仍不足以使體積≥v;return

以下為**:

#include using namespace std;

int n,m;

int ans=0x7fffffff;

int pre_r;//最下面一層的半徑

int dfs(int r,int h,int q,int deep,int v)

POJ 1190 生日蛋糕

生日蛋糕 一道很經典也很基礎的搜尋題目。有題目的條件我們可以得到兩個方程 sum rk rk hk n 和 s sum 2 rk hk r1 r1 首先考慮極端剪枝法。假設前i層體積為t,如果剩下的若干層,每層都去最小可能值,體積仍比n大,則剪去,如果剩下幾層都去最大值,體積仍比n小,也減去。如果當...

POJ 1190 生日蛋糕

呵呵,這道題弄死我。我覺得吧,凡事不能急於求成,比如這道經典的剪枝 搜尋,我就先查的題解,看了各種剪枝方法躊躇滿志,結果花了兩個小時寫的剪枝把自己都搞暈了。應該先有正確的搜尋方法再談剪枝不是嗎,所以我決定先用樸素的搜尋做一下 include includeint n,m int temp s 999...

POJ 1190 生日蛋糕

time limit 1000ms memory limit 10000k total submissions 17060 accepted 6074 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為r...