【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 由於要在蛋糕上抹...