生日蛋糕(BFS)

2021-08-04 10:38:30 字數 1225 閱讀 7169

題目鏈結

題目描述

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.顯然這樣的資料範圍想到的第一件事...