题意:给出边长为1的立方体的体积,对其进行包装,求出组合出最小的表面积。
思路:原来在heu做过,三重循环肯定超时,两重循环也有个优化,表面积 = 2*(a*b+a*c*b*c); 当a b c 最接近的时候(a=b=c),也就是立方体的时候是最小的表面积,所以对两个边循环的时候,可以先把V开三次方并向上取整,然后向两边枚举边长。
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int T , V;
scanf("%d",&T);
while (T --) {
scanf("%d",&V);
int l = ceil(pow(V , 1.0/3));
bool flag = 0;
int i , j , k;
int minn = 2*(1 + V + V);
for (i = l ; i > 0 ; i --)
for (j = l ; j <= V ; j ++) {
if (V%(i*j) == 0) {
k = V/(i*j);
minn = 2*(i*j+i*k+j*k)<minn?2*(i*j+i*k+j*k):minn;
}
}
printf("%d\n",minn);
}
}