NOI1999 生日蛋糕

2021-07-28 13:09:08 字數 1402 閱讀 7228

【noi1999】生日蛋糕

7月17日是mr.w的生日,acm-thu為此要製作乙個體積為nπ的m層生日蛋糕,每層都是乙個圓柱體。

設從下往上數第i(1<=i<=m)層蛋糕是半徑為ri,高度為hi的圓柱。當i時,要求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

附:圓柱公式

體積v=πr^2h

側面積a』=2πrh

底面積a=πr^2

[noi1999]

數學,搜尋,剪枝

對於這道題的面積,顯然只有最底一層的表面積需要計算,其他層只需要考慮側面積

首先考慮到直接搜尋會很慢,需要考慮到剪枝,我寫了兩個剪枝:

最優性剪枝(對面積):1、當前面積加上下一層的最小側面積比記錄的ans大,那麼該種方案定然不是最優的;2、如果剩餘體積對應的下一層側面積加上當前面積大於等於ans,該方案不是最優的(必須是大於等於因為下一層的半徑取不到當前的r)

剪完枝後就可以列舉下一層面積以及下一層高度,遞迴搜尋即可

為了方便,我預處理出了每一層的最小體積以及最小面積存於a、b陣列中

#include #include #include #include #include #include #include #include #include #include #define inf 2147483647

#define ll long long

using namespace std;

int n, m, a[30], b[30], ans = inf;

inline void search(int v, int s, int p, int r, int h)

//possible

if (v + b[p - 1] > n) return ;

//better

if (s + a[p - 1] > ans) return ;

if (2 * (n - v) / r + s>= ans) return ;

//search the next level's height

for (int i = r - 1; i >= p; --i)

}int main()

注意判斷不存在答案的情況

noi 1999 生日蛋糕

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

NOI1999 生日蛋糕

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

NOI1999 生日蛋糕題解

還是被這個立體的結構嚇到了,隔了半年才 題目描述 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層 生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當ir i r ri ri 1 且h i h hi hi 1 由於要在蛋糕上抹...