题意
- 给定蛋糕层数
,蛋糕总体积
,求解最最小表面积
- 对于蛋糕每层的半径和高度都是整数,且对于第i层,半径和高度都不小于i
思路
- 对于每一层,枚举可能的高度和半径,计算体积和表面积
- 对于枚举顺序,从最底下一层往上枚举,因为上面的层数越多,受限越多
- 对于每一层,半径和高度的下界都是层数,上界都是上一层的半径-1or高度-1
- 做到以上,通过20%,其余TLE
剪枝
- 如果枚举到一定层数,总体积-当前体积已经小于0,直接回溯
- 如果枚举到一定层数,累计表面积已经大于之前的最优解,直接回溯
- 如果枚举到一定层数,剩下的体积堆成一块都超过当前最优表面积,直接回溯
对第三条剪枝的论证
- 对于体积和表面积:
,
变为两倍,维持体积不变,高度缩小四倍,表面积缩小一半,所以体积不变的情况下,表面积最优是半径取最大,把所有的堆成一块即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,m,r[40],h[40];
int ans=1e9+7;
void dfs(int dp,int v,int s){
if(v<0||s>ans||s+v/r[dp-1]*2>ans) return;
if(dp>m){
if(v==0) ans=min(s+r[1]*r[1],ans);
return;
}
for(int i=r[dp-1]-1;i>=m-dp+1;i--){
for(int j=h[dp-1]-1;j>=m-dp+1;j--){
r[dp]=i;
h[dp]=j;
dfs(dp+1,v-i*i*j,s+j*i*2);
}
}
}
int main(){
scanf("%d%d",&n,&m);
r[0]=sqrt(n)+1;
h[0]=n+1;
dfs(1,n,0);
printf("%d",ans);
return 0;
}