生日蛋糕
time limit:1000ms
memory limit:10000k
total submissions:12965
accepted:4564
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
100sample output2
68hint
圓柱公式
體積v = πr
2h 側面積a' = 2πrh
底面積a = πr
2source
noi 99
解題思路:蛋糕是從下往上逐漸減小的,表面積由各層蛋糕側面積加頂面積,頂面積和為最底層蛋糕的頂面積,因此我們可以從最底層進行搜尋。因為半徑和高度都是整數,可以列舉,但直接搜必然超時,需要加上剪枝。
一共有兩個剪枝:
1. mind[i] 表示i層最小體積
mins[i] 表示i層最小側面積 則
si-1+2rihi+mins[m-i] >= best
di-1+ri2hi+mind[m-i] >= n
2. 當 s+2*剩餘體積/rk>=best時 可以剪枝
#include#include#includeusing namespace std;
const int n = 10000;
const int m = 25;
int n, m;
int mincost;
int mins[m], mind[m];
void init()
}void dfs(int k, int r, int h, int s, int d)
int ld = n - d;
for(int i = r - 1; i > m - k - 1; i--)
}}int main()
return 0;
}
POJ 1190 生日蛋糕
生日蛋糕 一道很經典也很基礎的搜尋題目。有題目的條件我們可以得到兩個方程 sum rk rk hk n 和 s sum 2 rk hk r1 r1 首先考慮極端剪枝法。假設前i層體積為t,如果剩下的若干層,每層都去最小可能值,體積仍比n大,則剪去,如果剩下幾層都去最大值,體積仍比n小,也減去。如果當...
POJ 1190 生日蛋糕
呵呵,這道題弄死我。我覺得吧,凡事不能急於求成,比如這道經典的剪枝 搜尋,我就先查的題解,看了各種剪枝方法躊躇滿志,結果花了兩個小時寫的剪枝把自己都搞暈了。應該先有正確的搜尋方法再談剪枝不是嗎,所以我決定先用樸素的搜尋做一下 include includeint n,m int temp s 999...
POJ 1190 生日蛋糕
time limit 1000ms memory limit 10000k total submissions 17060 accepted 6074 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為r...