传送门:poj2363
题目大意:有N个1*1*1的方块,放到一个立方体的盒子里面,求盒子的最小的表面积。
坑爹的题目……想多了,绕远了……
一开始以为意思是放到一个立方体盒子里面,求盒子的最小表面积,在那里找合理的构造方法把我蛋疼得……
后来仔细读题是把这些方块堆成立方体……卧槽……简直跪烂了……
然后又因为最近数论搞多了,就自然地想到把N进行整数拆分,将其因子组合成立方体的三维,求出其中最小的一个表面积。
根据数学知识,V相同的情况下,三维越接近应该S越小,正方体时S最小,于是就以N^1/3为标准开始组合边长……折腾了好久一直跪……
最后怒了……直接开暴力,枚举三维,N^3,不能接受。
因为边长c=n/a/b,省略一维,N^2,由于多case,悬。
又因为a*b<n,再省一部分,N^1.5,妥妥过了。
最后枚举 for (int i=1;i<=n;i++) for (int j=1;i*j<=n;j++)
然后问题就解决了……
这个悲伤的故事需要检讨……惯性思维太重了……水题就不该想多了……
另外注意Hint,用scanf和printf输入输出。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while (t--){
int n;
scanf("%d",&n);
int min=0x7f7f7f7f;
for (int i=1;i<=n;i++){
for (int j=1;i*j<=n;j++){
if (n%(i*j)!=0) continue;
int k=n/(i*j);
int s=2*i*j+2*i*k+2*j*k;
if (s<min) min=s;
}
}
printf("%d\n",min);
}
return 0;
}