題目鏈結
題目描述
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外,以上所有資料皆為正整數)
輸入 有兩行,第一行為n(n <= 10000),表示待製作的蛋糕的體積為nπ;第二行為m(m <= 20),表示蛋糕的層數為m。
輸出 僅一行,是乙個正整數s(若無解則s = 0)。
樣例輸入
100
2 樣例輸出
68 思路(借鑑大神):
1、記錄每一層的最小面積,和最小體積
2、剪枝處理:剩餘體積不夠,剪枝,剩餘所需要面積大於此時的最優解,剪枝。
3、高度才用滿足條件的最小高度min(達到剩餘體積所需要的最小高度,該層數的最小高度)
4、最難解決之處:2*(n-v)/lr+s>=ssum,在該處最小估算面積已經大於了此時最優解的面積,剪枝
#include
#include
using namespace std;
#define min(a,b) a>b? b:a
const int maxsize=5555555;
int ssum;
int mins[21],minv[21];
int n,m;
int dfs(int v,int
s,int ceng,int lr,int lh)
return
0 ; }
if(v+minv[ceng-1]>n) return
0; if(s+mins[ceng-1]>ssum) return
0; if(2
*(n-v)/lr+s>=ssum) return
0; for(int i=lr-1;i>=ceng;i--)
}}int main()
while(scanf("%d
%d",&n,&m)==2)
}
F 生日蛋糕
7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 ...
演算法實踐 生日蛋糕
7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 ...
生日蛋糕 解題報告
題目鏈結 題目大意 要製作乙個體積為n 的m層蛋糕,每層都是圓柱體。設從下往上數第i層蛋糕半徑為r i 高度為h i 當ir i 1 且h i h i 1 並使得外表面 最下一層的下底面除外 的面積q最小。令q s 答案輸出s。n 10000,m 20。題目分析 1.顯然這樣的資料範圍想到的第一件事...