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
給出部分公式
蛋糕的層數n (n <= 20) ,蛋糕體積v(<=100000)圓柱體積 v = r * r * h
圓柱側面積 s = 2 * r * h
圓柱底面積 c = r * r
意味著蛋糕塔的高度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.顯然這樣的資料範圍想到的第一件事...