题意:中文题。要制作一个体积为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外,以上所有数据皆为正整数)
思路:主要第三个剪枝比较难想:设剩余总体积为总体积减去蛋糕下面的层的总体积,剩余总面积是当前已得最优解减去蛋糕当前层以下的层的总面积。设ri为每层的半径,hi为每层的高度。蛋糕上面层的总面积是对2*ri*hi求和。总体积ri*ri*hi求和。剩余总体积*2再除以当前层的半径必须小于剩余总面积,否则返回。(2×sigma(ri*ri*hi)/rk > sigma(2*ri*hi) i=1~k)之所以左边大于右边是因为rk>ri 对于i<k。
其中v数组和a数组是前i个蛋糕都取最小半径和高时的最小可能体积和面积。
再有要注意的是两层循环的方向,从小到大搜索的话一定TLE。
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define N 20
int v[N+2],a[N+2];
int n,m,down,res=0x3fffffff;
void init(int d){
int i;
v[0] = a[0]