堆积木
时间限制: 1 Sec 内存限制: 32 MB[ 提交][ 状态][ 讨论版]
题目描述
小明的侄子要过生日了,小明买了一套儿童积木送他。这套积木由N个边长为1厘米的正方体小块组成,小明想把这些小块堆成一个大的矩形方体,然后将整个方体包裹上漂亮的包装纸,请问小明最少需要多少平方厘米的包装纸即可?
输入
输入的第一行为一个正整数C,表示测试样例的组数。
每组输入是一个正整数N(1<=N<=1000),表示积木块的个数。
每组输入是一个正整数N(1<=N<=1000),表示积木块的个数。
输出
对于每组输入,输出将整个方体完全包裹上包装纸所需要的包装纸的最小面积。
样例输入
5
9
10
26
27
100
样例输出
30
34
82
54
130
# include<stdio.h> # include<string.h> int v[1005][1005]; int n,Max; int W(int x,int y,int z) //求表面积 { return (x*y+x*z+y*z)*2; } void dfs(int x,int y,int z) { if(W(x,y,z)<Max) { Max=W(x,y,z); } for(int i=x;i<=n;i++) if(n%i==0) //剪枝 { for(int j=1;j<n;j++) { if(i*j<=n) //剪枝 { if(n%(i*j)==0) //剪枝 { int t=n/(i*j); if(!v[i][j]) { v[i][j]=1; //标记,长和宽没有区别 v[j][i]=1; dfs(i,j,t); } } } } } return ; } int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d",&n); Max=0x3f3f; memset(v,0,sizeof(v)); v[1][1]=1; dfs(1,1,n); printf("%d\n",Max); } return 0; }