关闭

POJ 2363 Blocks(水~)

236人阅读 评论(0) 收藏 举报
分类:

Description
有n块长宽高各为1的块,问怎么样将它们堆积后包装起来所用的包装纸最少
Input
第一行为数据组数m,之后m行每行一个整数n表示查询
Output
对于每组用例,输出最少包装纸面积
Sample Input
5
9
10
26
27
100
Sample Output
30
34
82
54
130
Solution
令堆积起来后的长宽高为a,b,c,则有a*b*c =n,实质上就是求2(a*b + b*c + a*c)的最小值,也就是2(n/a + n/b + n/c)的最小值。显然当a,b,c最接近的时候面积最小,故可以从小到大枚举a,b,c,这样最后一组可行解一定为最优解。注意n=0的情况需要特判
Code

#include<stdio.h>
int main()
{
    int m,n,i,j,k,res,a[100],b[100];
    scanf("%d",&m);
    while(m)
    {
        scanf("%d",&n);
        if(n==0)//0块特判 
            printf("6\n");
        else
        {
            res=0;
            for(i=1;i<=n;i++)//枚举 
                for(j=i;j<=n;j++)
                    for(k=j;i*j*k<=n;k++)
                        if(i*j*k==n)
                        {
                            a[res]=i;   
                            b[res++]=j; 
                        }   
            i=a[res-1];
            j=b[res-1];
            k=n/i/j;        
        printf("%d\n",2*i*j+2*i*k+2*j*k);
        }
        m--;
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:304806次
    • 积分:18439
    • 等级:
    • 排名:第492名
    • 原创:1603篇
    • 转载:0篇
    • 译文:0篇
    • 评论:57条
    最新评论