POJ 1190 生日蛋糕

2021-07-02 06:35:52 字數 1475 閱讀 2720

呵呵,這道題弄死我。。。

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

#include#includeint n, m;

int temp_s = 99999;

void search( int a, int r, int h, int v, int s);

int main(void)

void search( int a, int r, int h, int v, int s)

return;

} for( i = r - 1; i >= a; i--)

if( a == m) s = i * i;

search( a-1, i, j, v+i*i*j, s+2*i*j); // 這裡是作為新手的我一開始沒有想到的(事實上這裡的v,s隨i,j變化,所以作為引數傳遞很合理)

} }}

抱著僥倖的心理提交了一下,呵呵,果真超時了

好吧認命進行剪枝

根據 查的,初步確定以下幾個剪枝想法

#include#include#define min(a,b) (a > b ? b : a)					        // 這裡的寫法挺好的,免得再寫乙個函式了 

int n, m;

int temp_s = 999999; // temp_s 設定乙個很大的值

int min_v[25], min_s[25];

void search( int a, int r, int h, int v, int s); // 搜尋函式

void minset( int m); // 求最小值函式

int main(void)

return 0;

}void minset( int m)

}void search( int a, int r, int h, int v, int s)

if( s + min_s[a-1] >= temp_s || v + min_v[a-1] > n || 2*(n-v)/r + s >= temp_s) return;

// 第乙個條件即判斷:若此次體積加最小體積大於標準體積,放棄這個分支

// 第三個條件即判斷:若剩餘體積所需的最小表面積加已有的表面積大於最優解,放棄這個分支。貌似沒有這個判斷就會超時

// 我覺得這個題的剪枝包括兩個方面,第乙個方面是對下乙個狀態進行判斷,第二個方面是對遠景狀態進行判斷,其中第二個方面能篩下去很多很多不必要分支

for( i = r - 1; i >= a; i--)

}}

【恩,頭乙個半自主完成的搜尋+剪枝題,雖然前前後後包括讀題和寫部落格總結花了我將近五個小時,超時wa了無數次,但是做完還是很高興的,ac的那一剎感覺那一切都值了】

POJ 1190 生日蛋糕

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

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

poj 1190 生日蛋糕

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