AcWing 168 生日蛋糕

2021-10-05 10:53:49 字數 2453 閱讀 6232

題目描述:

7月17日是mr.w的生日,acm-thu為此要製作乙個體積為nπ的m層生日蛋糕,每層都是乙個圓柱體。

設從下往上數第i層蛋糕是半徑為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)。

資料範圍

1≤n≤10000,

1≤m≤20

輸入樣例:

100

2

輸出樣例:

68
分析:

本題雖然看起來比較複雜,但是只要稍加分析,思路還是很清晰的。將自上而下的各層蛋糕編號為1-m,題目要求我們設計乙個m層蛋糕,下層的蛋糕比上層的蛋糕半徑和高度都要大,並且總的體積為n,求最小的表面積。設第i層蛋糕的半徑是ri,高度是hi,半徑和高度都是整數。有ri < ri+1,hi < hi+1,根據題目要求,我們下面先忽略體積和表面積公式中的π。由於最上層的蛋糕半徑和高度都要是正整數,所以r1和h1至少是1,r2要大於r1,至少是2,由此可得,第i層蛋糕的半徑和高度至少是i。蛋糕體積公式為sum(ri*ri*hi),表面積公式為rm*rm + sum(2ri*hi),也就是最下層蛋糕的底面積加上各層蛋糕的側面積,這裡有個簡單的推導,第m層的上表面積是sm - sm-1,第m-1層的上表面積是sm-1 - sm-2,...,第1層的上表面積是s1,加起來得到上表面積的總和就是sm = rm*rm。

考慮下剪枝,首先是優化搜尋順序,為了先搜尋的分支數少,我們應該自大到小搜尋,也就是從第m層搜尋到第1層,並且體積公式中ri是平方級別的,變化率要高於hi,所以先搜ri,再搜hi,對於半徑和高度的列舉也應該是自大到小的。下面考慮各層高度和半徑的範圍,前面說到,第i層的高度和半徑至少是i,這就是各層高度和半徑的最小值,並且ri < ri+1,hi < hi+1,這是其中的乙個上界。設mins[i]表示1到i層表面積的最小值,minv[i]表示1到i層體積的最小值,則mins[i] = mins[i-1] + 2* i * i,因為第i層高度和半徑都至少是i,minv[i] = minv[i-1] + i * i * i。我們從第m層蛋糕搜到當前的第u層時,設已經使用的表面積是s,體積是v,則從第u層到第1層留給我們的體積最多只有n - v了,所以第u層的半徑ru*ru*hu <= n - v,hu至少是u,所以ru <= sqrt((n-v)/u),當然,演算法競賽高階指南上面的公式這裡沒有除以u,因為把h看作最小是1了,對結果影響不大。同樣,hu <= (n-v) / v / v,這就是hu和ru的另乙個上界,上界取兩個上界的最小值即可。

可行性剪枝:前面說到從第m層搜到第u層總的體積是v,而從第1層到第u層體積至少是minv[u],所以當v + minv[u] > n時就說明超過了給定的體積n,方案不合法。

最優性剪枝:第乙個最優性剪枝是s + mins[u] >= ans時,這裡ans是之前搜到的最小表面積,也就是當這個方案搜下去的表面積不可能優於小於之前搜到的解時,就應該否定這個方案。還有第二個最優性剪枝,考慮下從第1層到第k層的體積和表面積的表示式,s = sum(2*ri*hi),v = sum(ri*ri*hi),則s = sum(2*ri*hi*rk+1 / rk+1) > 1 / rk+1 * sum(2*ri*ri*hi ) = 2 / rk+1 * sum(ri*ri*hi) = 2*v / rk+1,sum表示i從1到k求和。從第m層到第u層已有的表面積是s,從第1層到第u層的表面積一定超過2*v/ru+1,從第1層到第u層剩下的體積是n - v,所以當s + 2*(n-v)/ ru+1  >= ans時,s + s > ans,一定不是最優解,所以可以剪枝。

最後遞迴的邊界是u == 0,遍歷完了所有層蛋糕,當v恰好是n時,就可以更新最優解了。

#include #include using namespace std;

const int n = 22;

int n,m,ans = 1e9;

int mins[n],minv[n],r[n],h[n];

void dfs(int u,int v,int s)

for(int r = min(r[u+1]-1,(int)sqrt((n-v) / u));r>=u;r--)

}}int main()

r[m + 1] = h[m + 1] = 1e9;

dfs(m,0,0);

if(ans == 1e9) cout<<"0"

}

ACWING168 生日蛋糕(剪枝dfs)

月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求ri ri 1且hi hi 1。由於要在蛋糕上抹忌廉,為盡可能節約經費,我們希望蛋糕外表面 最下一層的下底面除外 的面積q最小。令...

1710 生日蛋糕

1710 生日蛋糕1999年noi全國競賽 時間限制 2 s 空間限制 128000 kb 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當iri 1且hi hi 1。由於要在...

POJ 1190 生日蛋糕

生日蛋糕 一道很經典也很基礎的搜尋題目。有題目的條件我們可以得到兩個方程 sum rk rk hk n 和 s sum 2 rk hk r1 r1 首先考慮極端剪枝法。假設前i層體積為t,如果剩下的若干層,每層都去最小可能值,體積仍比n大,則剪去,如果剩下幾層都去最大值,體積仍比n小,也減去。如果當...