c 畫蛋糕 題解 生日蛋糕 C

2021-10-13 10:28:46 字數 1415 閱讀 1810

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

sample output

hint

圓柱公式

體積v = πr^2h

側面積a』 = 2πrh

底面積a = πr^2

這道題目主要考察的是dfs的剪枝,注釋已經打在**裡了,再看不懂我也沒辦法。

思路:從第一層到第m層從上自下考慮,每次拓展第dep層的h和r,然後核心語句(極大化剪枝)

if(s+2*i*j+back[dep+1]>=ans)break;//極大化剪枝

back是底面積的字尾和陣列:

for(int i=m;i>=1;i--)

back[i]=back[i+1]+2*(m-i+1)*(m-i+1);

下面是**,注釋很詳細了,第一篇寫了這麼多注釋的**, 就別抄了a.a

1 /*

2 ①m-dep+1:這個意思是還剩下未考慮的蛋糕層數,同時也代表著第dep層最小的高和半徑3 ②sqrt(n-v):因為n-v是剩下的體積,開根號之後就接近於r,h越大誤差越大,這樣能夠有效地提高**迴圈效率4 */

5 #include

6 using namespacestd;7 int n,m,ans,h[10010],r[10010];//h[i]=第i層蛋糕的高,r[i]=第i層蛋糕的半徑

8 int back[11000];//底面積字尾和陣列,因為實在不知道取什麼名字乾脆就這樣了

9 void dfs(int dep,int s/*表面積*/,int v/*體積*/)10 16 int u=min(int(double(sqrt(n-v))/*②*/),r[dep-1]-1);17 for(int i=u;i>=(m-dep+1)/*①*/;i--)18 29 }30 }31 intmain()32 38 ans=0x3f3f3f3f;r[0]=h[0]=0x3f3f3f3f;39 dfs(1,0,0);40 if(ans==0x3f3f3f3f)41 cout<<0<

42 else cout<

ov.

生日蛋糕(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。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 ...

演算法實踐 生日蛋糕

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