演算法實踐 生日蛋糕

2021-10-04 20:46:12 字數 2737 閱讀 6194

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外,以上所有資料皆為正整數)

有兩行,第一行為n(n <= 10000),表示待製作的蛋糕的體積為nπ;第二行為m(m <= 20),表示蛋糕的層數為m。

僅一行,是乙個正整數s(若無解則s = 0)。

100

2

68
極高,深搜,動態規劃

首先,整個過程不需要考慮pi

給出部分公式

圓柱體積   v = r * r * h

圓柱側面積 s = 2 * r * h

圓柱底面積 c = r * r

蛋糕的層數n (n <= 20) ,蛋糕體積v(<=100000)

意味著蛋糕塔的高度h的最小值是n

可以用遞推公式算出第i層到第n層蛋糕圓柱側面積的最小值之和

可以用遞推公式算出第i層到第n層蛋糕圓柱體積的最小值之和

需要估計r和h的上屆

根據以上的計算結果,可以估算出底面積半徑的最大值maxr

根據以上的計算結果,可以估算出最底層的最大高度值maxh

最底層圓柱的區間 h = 【1 ,maxh】

最底層圓柱的底半徑 n =【n,maxr】

深搜由於要計算表面積(露出來的),那麼在一層一層的計算過程中,如果最下面的一層確定了,則上表面積就確定了,所以搜尋框架從下到上。

深度優先搜尋的搜尋目標:列舉每一層可能的高度和半徑,找到可行方案,記錄圓柱體的表面積之和

搜尋面對的狀態有:第幾層,半徑和高度,剩餘體積,累計表面積

搜尋和列舉的順序? 從大開始遞減列舉 從底層往上搭,從n開始遞迴搜尋

剪枝啟發式剪枝:

可行性剪枝:

可行性剪枝+啟發性剪枝 :

//code by andy

#include

using

namespace std;

#define inf 0x7fffffff

#define buttonarea(r) (r*r)

//底面積

#define surarea(r,h) (2*r*h)

//側面積

#define volume(r,h) (r*r*h)

//體積

#define v2surarea(r,v) (2*v/r)

//根據體積和半徑計算側面積

int v,n,minsurarea = inf;

//遞推計算各層的體積與側面積區間下界

int summins[27]

,summinv[27]

;//第幾層、半徑、高度、剩餘體積、累計表面積

void

dfs0

(int ifloor,

int prer,

int preh,

int leftv,

int surarea)

if(prer>1&&

v2surarea

(prer-

1,leftv)

+surarea >=minsurarea)

return

;//可行性剪枝

if(leftv

)return

;//可行性剪枝+啟發性剪枝 累計表面積+最小表面積》全域性最小表面積

if(surarea+summins[ifloor]

>=minsurarea)

return

;//列舉所有的r和h,深搜

for(

int r=prer-

1;r>=ifloor;r--)}

intmain()

//最底層最大的h和r

//最頂層體積最小,最底層半徑最大為n

int maxh =

(v-summinv[n-1]

)/buttonarea

(n)+1;

//高度為1時圓柱半徑最大

int maxr =

sqrt

(double

((v-summinv[n-1]

)+1)

);minsurarea = inf;

//將minsubarea置成乙個很大的值

dfs0

(n,maxr,maxh,v,0)

;if(minsurarea==inf)

cout<<

0<

else

cout<

return0;

}

需要找到一種方案從頭至尾的最優解需要使用深搜,與動態規劃,貪心演算法不同的是,採用深度優先搜尋求最優解的問題不具有最優子性質。而在深搜的過程中,複雜度較高,需要進行適當的剪枝降低時間複雜度。主要的剪枝方案有可行性剪枝和啟發性剪枝。

生日蛋糕(BFS)

題目鏈結 題目描述 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最...

F 生日蛋糕

7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 ...

生日蛋糕 解題報告

題目鏈結 題目大意 要製作乙個體積為n 的m層蛋糕,每層都是圓柱體。設從下往上數第i層蛋糕半徑為r i 高度為h i 當ir i 1 且h i h i 1 並使得外表面 最下一層的下底面除外 的面積q最小。令q s 答案輸出s。n 10000,m 20。題目分析 1.顯然這樣的資料範圍想到的第一件事...