生日蛋糕 搜尋剪枝

2022-05-19 06:19:30 字數 2276 閱讀 1574

《更新提示》

《第一次更新》

《正文》

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×πn×π;第二行為m(m <= 20),表示蛋糕的層數為m。

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

100

2

68
預備知識:圓柱體體積公式\(v=\pi r^2h\),圓柱體側面積公式\(s'=2\pi rh\),圓柱體底面積公式\(s=\pi r^2\)

輸出和輸入均不考慮\(\pi\),所以直接無視所有公式中的\(\pi\)即可。

直接考慮乙個搜尋演算法,狀態為\((dep,s,v)\),代表當前搜尋到第\(dep\)層(從上往下數),表面積為\(s\),體積為\(v\),並且記錄了第\(m\)至第\(dep-1\)層的高度和半徑為\(h\),\(r\)陣列(小寫)。然後對於每一層,列舉其高度\(h\)和半徑\(r\),進行搜尋。

然後考慮如下的剪枝:

由於蛋糕\(dep\)層以上還有\(m-dep\)層,高度和半徑大小的要求都是遞減的,所以列舉的左邊界很容易得到。

對於半徑,其列舉右邊界顯然不能大於等於\(r_\),不然不滿足遞減性,假設第\(dep\)層就是最後一層,那麼由圓柱體體積公式\(\pi r^2h=\pi (n-v)\)可以得到半徑\(r\)顯然需要滿足\(r \leq \sqrt\),這就是半徑的列舉範圍。

對於高度,同樣右邊界不能大於等於\(h_\),不然不滿足遞減性,由於已知\(r\),那麼我們也可以用體積公式得到高度\(h\)顯然需要滿足\(h \leq \frac\),這就是高度的列舉範圍。

由圓柱體表面積與體積公式可以得到第\(1\)到第\(dep-1\)層的體積之和為

\[\sum_^(h_i*r_i^2) =n-v

\]側面積之和為

\[2\sum_^(h_i*r_i)

\]那麼可以進行如下推導:

\[2\sum_^(h_i*r_i)

\\=\frac}\sum_^(h_i*r_i)*r_

\\ = \frac}\sum_^(h_i*r_i*r_)

\\ \geq \frac}\sum_^(h_i*r_i^2)

\\ =\frac}=x

\]即第\(1\)到第\(dep-1\)層的表面積之和大於等於\(x\),所以如果\(s+x\)大於等於已經搜到的答案時,也可以剪枝。

很多時候,\(dfs\)的剪枝是可以通過如上的縮放方式推導出來的,這就要求我們需要發現題目隱藏的性質,合理利用已知條件進行優化。

\(code:\)

#includeusing namespace std;

#define mset(name,val) memset(name,val,sizeof name)

#define filein(str) freopen(str".in","r",stdin)

#define fileout(str) freopen(str".out","w",stdout)

const int n=10000+20,m=20+20,inf=0x3f3f3f3f;

int n,m,h[m],r[m],minsumv[m],minsums[m],ans=inf;

inline void input(void)

inline void init(void)

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

}inline void dfs(int dep,int s,int v)

if(2*(n-v)/(r[dep+1])+s>ans)return;

if(v+minsumv[dep]>n)return;

if(s+minsums[dep]>ans)return;

for(int r=min((int)sqrt((n-v)*1.0),r[dep+1]-1);r>=dep;r--) }

}int main(void)

《後記》

生日蛋糕的多種剪枝

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

深搜剪枝 生日蛋糕

時間限制 1 sec 記憶體限制 128 mb 提交 14 解決 8 提交 狀態 討論版 命題人 add cy 7月17日是mr.w的生日,acm thu為此要製作乙個體積為n 的m層生日蛋糕,每層都是乙個圓柱體。設從下往上數第i 1 i m 層蛋糕是半徑為ri,高度為hi的圓柱。當i m時,要求r...

POJ 生日蛋糕 DFS 剪枝

題目鏈結 題目大意 乙個多層生日蛋糕。要求下面一層一定要比上面的一層大而且高,求符合該條件的蛋糕,其中最小的表面積 解題思路 要求出最小表面積且下面的要比上面的大,所以每一層的半徑和高度最小值為該層的層數 從上到下數的層數 這樣一一枚舉每層的半徑和高度。但是由於情況太多,所以需要剪枝來降低搜尋的次數...