Blocks | ||||||
| ||||||
Description | ||||||
Donald wishes to send a gift to his new nephew, Fooey. Donald is a bit of a traditionalist, so he has chosen to send a set of N classic baby blocks. Each block is a cube, 1 inch by 1 inch by 1 inch. Donald wants to stack the blocks together into a rectangular solid and wrap them all up in brown paper for shipping. How much brown paper does Donald need? | ||||||
Input | ||||||
The first line of input contains C, the number of test cases. For each case there is an additional line containing N, the number of blocks to be shipped. N does not exceed 1000. | ||||||
Output | ||||||
Your program should produce one line of output per case, giving the minimal area of paper (in square inches) needed to wrap the blocks when they are stacked together.
| ||||||
Sample Input | ||||||
5 9 10 26 27 100 | ||||||
Sample Output | ||||||
30 34 82 54 130 | ||||||
Source | ||||||
Waterloo local 2002.09.21 | ||||||
Recommend | ||||||
程宪庆 |
题目大意:
给你n个1*1*1大小的立方体,让你将其包装起来,而且要求包装起来的形状必须是正方体/长方体,问最少包装纸花费。
思路:
1、首先我们知道,一个长方体/正方体最重要的三个元素就是:长、宽、高。那么我们想办法找出来长宽高abc使得其外表面积最小即可。
2、找了半天规律,最后入手点发现应该在n<=1000上边。因为n并不大,我们可以通过枚举a,b然后用n/a*b得到c,如果此时a、b、c的方案是一种可行方案,那么a*b*2+b*c*2+a*c*2就是一种可行方案解,然后我们一直枚举下去,维护最小方案值即可。
3、简单优化:如果a*b>n跳出即可。
Ac代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
int output=0x3f3f3f3f;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i*j>n)break;
int a=i,b=j;
int c=n/(a*b);
if(a*b*c==n)
{
output=min(output,a*b*2+b*c*2+a*c*2);
}
}
}
printf("%d\n",output);
}
}