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
100
2
sample output
68
hint
圓柱公式
體積v = πr2h
側面積a' = 2πrh
底面積a = πr2
非常多的神奇的剪枝,先求出字首和陣列便於剪枝。
幾處剪枝 1、當當前體積+剩下幾層的最小體積》總體積n 不符合條件,剪枝。
2、當前表面積+剩下幾層最小表面積》ans 沒必要進行下去,剪枝。
3、(ans-當前表面積)<=(總體積-當前體積)/r*2 大於最小可能的剩餘表面積,沒必要進行,一定不是最優解 體積v = πr2h r和h對表面積的影響都是呈線性關係,r呈指數倍關係對v產生影響。所以說,(總體積-當前體積)/r*2為最小可能剩餘面積,不是最大可能剩餘面積
4、下一次搜尋的h可能的最大值,在h-1和(總體積-當前體積-剩下幾層的最小體積)/(i*i) 選擇比較小的。
#include#include#include#includeusing namespace std;
int n,m,ans;
int vmin[25],smin[25];
void init()//自下而上,一層為最上面的一層
}void dfs(int v,int s,int cnt,int r,int h)
}}int main()
poj 1190 生日蛋糕(DFS 剪枝)
生日蛋糕 time limit 1000ms memory limit 10000k total submissions 12965 accepted 4564 description 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數...
POJ1190 生日蛋糕(DFS剪枝)
生日蛋糕 time limit 1000ms memory limit 10000k total submissions 19282 accepted 6841 description 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數...
POJ 1190 生日蛋糕(DFS 剪枝)
本題是一道dfs 剪枝的經典例題,詳情請看 注釋,裡面按照我個人的理解進行了詳細的解釋 include include include include include include include include include include include using namespace st...