7月17日是mr.w的生日,acm-thu為此要製作乙個體積為nπ的m層生日蛋糕,每層都是乙個圓柱體。
設從下往上數第 i(1
≤i≤m
)i(1\leq i \leq m)
i(1≤i≤
m)層蛋糕是半徑為 ri , 高度為 hi 的圓柱。當 i
<
mi < m
i<
m 時,要求 r
i>ri
+1
r~i~ > r~i+1~
ri>ri
+1且 h
i>hi
+1
h~i~ > h~i+1~
hi>hi
+1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面(最下一層的下底面除外)的面積q最小。
令q = sπ
請程式設計對給出的n和m,找出蛋糕的製作方案(適當的ri和hi的值),使s最小。(除q外,以上所有資料皆為正整數)
演算法標籤:dfs
採用自底向上的搜尋。由題可知,所有數均為正整數,所以所有計算無需關心 π
\piπ 。
首先確定半徑r的最大值,高度h的最大值。
當高度均為1時,r最大。
當圓柱上表面面積均為1時,h最大。
因為所有資料均為正整數,所以可以求得第 i 層到第 1 層的最小體積和最小側面積,假設第一層半徑r為1。
即 : ::m
inv[
i]=m
inv[
i−1]
+i∗i
∗i
minv[i] = minv[i-1] + i*i*i
minv[i
]=mi
nv[i
−1]+
i∗i∗i(1
≤i≤m
)(1 \leq i \leq m)
(1≤i≤m)mi
ns[i
]=mi
ns[i
−1]+
2∗i∗
imins[i] = mins[i-1] + 2*i*i
mins[i
]=mi
ns[i
−1]+
2∗i∗i(1
≤i≤m
)(1 \leq i \leq m)
(1≤i≤m
)dfs種三個剪枝條件:
設剩餘面積 dv=
n−su
mv
dv = n - sumv
dv=n−s
umv ,
還需要的表面積 :
s = 2×
\times
×ri×
\times
×hi + 2×
\times
×ri-1
×
\times
×hi-1 + ⋯
\cdots
⋯ +2×
\times
×r1×
\times
×h1≥
\geq
≥ 2×
\times
×ri×
\times
×hi×
\times
×(ri/r) + 2×
\times
×ri-1
×
\times
×hi-1
×
\times
×(ri-1/r) + ⋯
\cdots
⋯ +2×
\times
×r1×
\times
×h1×
\times
×(r1/r) = 2*dv/r
( 1≤
i≤de
pth−
1)
(1 \leq i \leq depth-1)
(1≤i≤d
epth
−1)r 為當前半徑,可知 r >
>
>
// tsworld
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
// 初始化
const
long
long n =30;
const
int maxx =
0x3f3f3f3f
;// 定義
int n,m;
// 最小體積和最小面積
int minv[n]
,mins[n]
;// result
int ans;
void
dfs(
int depth,
int sumv,
int sums,
int r,
int h)
if(sumv + minv[depth-1]
> n)
return;if
(sums + mins[depth-1]
> ans)
return;if
(sums+2*
(n-sumv)
/r >= ans)
return
;// 因為r值最小為1,所以每一層最小值等於其所在層數
for(
int i = r-
1;i >= depth;i--)}
intmain()
// 因為求最小值,ans初始化為最大值
ans = maxx;
dfs(m,0,
0,r_best,h_best);if
(ans == maxx)
cout<<0;
else
cout
}
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...