解题思路: 1:我们将蛋糕的每一层看作是一个圆柱体,并且用半径R和高度H来描述。
2:通过给定的蛋糕体己N和层数M,我们需要找到一种制作方案,来使得蛋糕的外表面积最小。
注意事项:1:在编写代码时,要注意变量的命名和初始化
2:剪枝时要分析各种情况,确保剪枝的正确性
3:调试代码时,可以使用一些测试来验证算法的正确性和效率
参考代码:
#include <bits/stdc++.h>
using namespace std;
int n, m;
int ans = 1e9;
void dfs(int v, int storey, int r, int h, int surface_area) {
if (v < 0) return; // 剩余体积小于0
if (surface_area >= ans) return; // 累计表面积大于已知最小表面积
if (r * r * h * (m - storey + 1) < v) return; // 按下层体积算后边几层的和也没有剩余体积大
if (storey > m) { // 当前第m+1层
if (v > 0) return; // 体积还有剩余
ans = min(ans, surface_area); // 更新最小表面积
return;
}
for (int i = r - 1; i >= m - storey + 1; i--) { // 枚举半径
for (int j = h - 1; j >= m - storey + 1; j--) { // 枚举高度
dfs(v - i * i * j, storey + 1, i, j, surface_area + 2 * i * j);
}
}
}
int main() {
cin >> n >> m;
for (int i = sqrt(n / m); i >= m; i--) { // 枚举底层半径
for (int j = n / (i * i); j >= m; j--) { // 枚举底层高度
dfs(n - i * i * j, 2, i, j, i * i + 2 * i * j);
}
}
if (ans == 1e9) {
cout << 0;
} else {
cout << ans;
}
return 0;
}
0.0分
8 人评分