生日蛋糕 POJ 1190

2022-05-01 07:30:08 字數 1343 閱讀 6226

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

100

2

sample output

68
hint

圓柱公式 

體積v = πr 2h 

側面積a' = 2πrh 

底面積a = πr 2

先要構建乙個mins[25],minv[25],這位最小值條件

if (sumv+minv[depth-1]>n || sums+mins[depth-1]>best || sums+2*(n-sumv)/r>=best) return ;

剪枝 sums+2*(n-sumv)/r>=best 最為重要 

sums已用的面積加上   (n-sumv)剩餘面積 除以r  是h*r再乘以2 就是剩下面積 

1 #include2 #include3 #include4 #include5 #include6 #include

7 #include8

using

namespace

std;

9int best=10000010;10

int mins[25],minv[25

],n,m;

11void dfs(int depth,int sumv,int sums,int r,int

h )

16if (sumv+minv[depth-1]>n || sums+mins[depth-1]>best || sums+2*(n-sumv)/r>=best) return;17

for (int i=r-1 ;i>=depth ;i--)23}

24}25int

main()

32while(scanf("

%d%d

",&n,&m)!=eof)

38return0;

39 }

生日蛋糕 POJ 1190

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

F 生日蛋糕 POJ 1190

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

POJ 1190 生日蛋糕

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