洛谷 P1731 生日蛋糕

2022-04-10 15:51:32 字數 1579 閱讀 9183

7月17日是mr.w的生日,acm-thu為此要製作乙個體積為nπ的m層

生日蛋糕,每層都是乙個圓柱體。

設從下往上數第i(1<=i<=m)層蛋糕是半徑為ri, 高度為hi的圓柱。當iri+1且hi>hi+1。

由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面(最下一層的下底面除外)的面積q最小。

令q= sπ

請程式設計對給出的n和m,找出蛋糕的製作方案(適當的ri和hi的值),使s最小。

(除q外,以上所有資料皆為正整數)

輸入格式:

有兩行,第一行為n(n<=20000),表示待製作的蛋糕的體積為nπ;第二行為m(m<=15),表示蛋糕的層數為m。

輸出格式:

僅一行,是乙個正整數s(若無解則s=0)。

輸入樣例#1:

100

2

輸出樣例#1:

68

思路:搜尋+剪枝。

錯因:一開始只加了可行性剪枝,拿到了60分,後來才知道還有最優化剪枝。

60分的可行性剪枝:

#include#include

#include

#include

#include

using

namespace

std;

int n,m,ans=0x7f7f7f7f,sal,val,use[16

];struct

nondv[

16];

void dfs(int

now)

for(int i=v[now-1].h-1;i>=m-now+1;i--)

}}int

main()

ac的最優化剪枝:

#include#include

#include

#include

#include

#include

using

namespace

std;

int nn,m,n,ans=0x7f7f7f7f

;int ss[21],sv[21

];void dfs(int t,int sal,int val,int lr,int

lh)

if(val+sv[t]>n) return

;

if(sal+ss[t]>ans) return

;

if(sal+2*(n-val)/lr>ans) return;//

for(int r=lr-1;r>=t;r--)

}int

main()

dfs(m,

0,0,sqrt(n),n);

if(ans==0x7f7f7f7f) cout<

;

else cout<

return

0;

}

洛谷 P1731 生日蛋糕

7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層 生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i include include include include using namespace std const int...

P1731 生日蛋糕

原題鏈結 dfs 注意剪枝 這個剪枝還挺麻煩的 首先是最優性剪枝 如果當前的面積 之後可行的最小面積仍然大於現在的最優解 那麼捨去 可行性剪枝 如果當前的體積 之後可行的最大體積仍小於規定體積 捨去從大到小列舉是為了方便確定範圍 include include include include inc...

P1731生日蛋糕 減枝

這道題可以通過一般的搜尋找到思路,但是很顯然會超時所以需要優化 其中需要三重優化 第一重是如果已用面積 最小面積仍然超過最優答案就返回 第二重是如果已用體積 最小體積仍然超過要求體積就返回 第三重剪枝是假設剩餘所有的體積都用來做下一層那麼此時下一層的體積是最大,而半徑會最大,從而表面積最小 incl...