『算法-ACM竞赛-DFS』POJ 1190 生日蛋糕
『算法-ACM 竞赛-DFS』POJ 1190 生日蛋糕
Description
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 外,以上所有数据皆为正整数)
Input
有两行,第一行为 N(N <= 10000),表示待制作的蛋糕的体积为 Nπ;第二行为 M(M <= 20),表示蛋糕的层数为 M。
Output
仅一行,是一个正整数 S(若无解则 S = 0)。
Sample Input
100
2
Sample Output
68
Solution
由于深度一定(m),所以使用深度优先搜索,自上而下的设定蛋糕序号,最顶层的为第 1 层,……,最底层的蛋糕为第 m 层,很明显满足题目条件的前 i 层的(从顶层(也就是编号为 1 的层)开始计数)最小面积 mins[i]和体积 minv[i]是在该层的半径以及高度都为 i 时取得,如果采用一般的神搜肯定会超时,所以这题还需要剪枝,剪枝条件有(从 m 层向上搜,假设前 level 层的体积为 v,面积为 s,当前所得的最小面积为 best):
1>因为前 level 层的体积为 v,如果剩下的几层的体积都取最小可能值,总体积还是比 n 大,那么则说明前 level 层的方案不可行,所以可以剪枝(剪枝条件为:v+minv[dep-1]>n)
2>因为前 level 层的面积为 s,如果剩下的几层的面积都取最小可能值,所得的面积和比已经得到的所求的最小面积 best 大,也可以进行剪枝(剪枝条件为:s+mins[dep-1]>best)
3>因为前 level 层的体积为 v,那么剩余的 m-level 层的体积满足:n-v=(hk+……+hm)(k=level+1,……,m)
而剩余部分的表面积满足:lefts=2*(r[k]h[k]+……+r[m]h[m])>2(n-sv)/r[level] (k=level+1,……,m)
显然有上述不等式 lefts=best-s>2(n-)/r,即 2*(n-v)/r+s
1 |
|