POJ 1190 生日蛋糕

2021-09-11 05:55:53 字數 1056 閱讀 7393

要做n層的蛋糕,從第n層開始做,到第一層,這是一道dfs,另外,這道題需要剪枝4次;

大體框架就是,

1、我們找到最底層半徑r以及高h的取值範圍;

怎麼找呢,r、h的最小值可以很容易判斷,因為要求從下到上要求蛋糕的半徑和高度要遞減,r、h又為整數,所以r,h的最小值要至少為n;找到最小之後,就可以來求最大值;

rrh= v(最底層);

首先我們要求前m-1層的最小值,然後就會得到最底層的最大值;求前m-1層的最小值,即求每一層的最小值;每一層的最小值怎麼求呢?可以遞推,第一層的最小值是什麼,當r和h取什麼值的時候取得?由圓柱體積公式,顯然,當r和h都取最小值的時候取得,又r和h為正整數,所以當r和h都取1的時候取得,即當r == 1 && h == 1的時候取得;這時候怎麼遞推呢,可以用乙個for迴圈,來累加,每一層的r和h的最小值即r和h從上到下一層加一;這樣求出每一層的最小值,在加上前面所有層的最小值即可求出前m-1層的最小值,就可以求出最底層的最大值;

2、然後就進行dfs,遞迴要搭的體積,多少層,目前未建好的最底層的高度和半徑;遞迴終止的條件就是當n == 0時,即已經建完了n層蛋糕,如果v不為0,證明不合理,就返回,否則就取之前最小的體積和當前的體積的最小值,如果在遞迴過程中要搭建的體積不大於0了,就返回,因為每一層的體積肯定大於等於0;然後就是兩個巢狀for迴圈來列舉;列舉半徑和高度,從最大值到最小值或者從最小值到最大值;在外迴圈需要加乙個判斷,如果是最底層的話,需要求出最底層的底面積,這樣就不用每一層都求了,因為要抹忌廉,奶油除了要在側面抹,也要在上面抹,而最底層的底面積就是所有層上面暴露部分的和;

以上是大體框架;

3、剪枝;

一、如果已經搭建的體積或搭建完的最小體積(不管是否正確取最小值)一定會大於minarea,就返回;搭建完的最小體積就是已經搭建的體積加上剩餘層數的最小體積,在main中已經求得;

二、未搭建的最小體積一定會大於剩下的體積,返回;

三、未搭建的最大體積一定會小於剩下的體積,返回;未搭建的最大體積就是從未搭建的最底層開始,取當前的r和h,然後取每一層最大的r和h,即每層r和h都只減1;

四、若r和h小於當前層數,一定不對,返回;因為第一層r和h的最小值至少為1;

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...