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