POJ 2363 Blocks(水~)

本文介绍了一种解决堆积n个单位立方体后所需最小包装纸面积的算法,通过枚举可能的堆叠方式,计算长宽高的组合,进而得出最小面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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--;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值