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