【题目链接】
OpenJudge NOI 2.1 7216:Minecraft
【题目考点】
1. 枚举
【解题思路】
该题等价为:求体积为n的棱长都是正整数的长方体的最小表面积。
显然,这个长方体的三条棱a,b,c必须都是n的因数。
枚举长方体的两条棱:a与b
如果n能整除a*b,那么第三条棱存在。
第三条棱可以通过
c
=
n
/
(
a
∗
b
)
c=n/(a*b)
c=n/(a∗b)得到,求出每个可能的长方体的表面积。
比较得到所有体积为n的长方体的表面积的最小值。
- 枚举对象:长方体的两条棱a,b
- 枚举范围:n的因数
- 判断条件:求表面积的最小值
【题解代码】
解法1:枚举
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
int main()
{
int n, f[1005], fn = 0, minArea = INF;//f[i]:n的第i个因数 minArea:面积最小值
cin >> n;
for(int i = 1; i <= n; ++i)
if(n%i == 0)
f[++fn] = i;
for(int i = 1; i <= fn; ++i)//第一条棱长f[i]
for(int j = 1; j <= fn; ++j)//第二条棱长f[j]
{
int a = f[i], b = f[j], c;//a,b,c:三条棱
if(n%(a*b) == 0)//如果n/(a*b)存在
{
c = n/(a*b);//求出第三条棱
minArea = min(minArea, 2*(a*b+b*c+c*a));//求出当前长方体表面积,与已知的最小值比较
}
}
cout << minArea;
return 0;
}