2800: 【基础】装箱问题

2800: 【基础】装箱问题
时间限制: 1 Sec 内存限制: 32 MB
提交: 484 解决: 196
[提交] [状态] [讨论版] [命题人:ghost79]

题目描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1,2*2,3*3,4*4,5*5,6*6。这些产品通常使用一个6*6*h的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。

输入
一行,六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量ai (0<=ai<=100)。

输出
输出一个整数代表订单所需的最小包裹数。

样例输入
样例1:
0 0 4 0 0 1

样例2:
7 5 1 0 0 0

样例输出
样例1:
2

样例2:
1

提示
30%的数据,只有6*6,5*5,4*4三种型号的产品。

100%的数据,0<=ai<=100。

题解如下

#include<stdio.h>

int main()
{
    int ar[7];  //数组开大点,方便后期使用
    for(int i=1;i<=6;i++)
    {
        scanf("%d",&ar[i]);
    }
    int sum_parcel=0;   //总共需要的包裹数
    for(int i=6;i>=1;i--)    //循环分类讨论
    {
        if(ar[i]!=0)
        {
            if(i==6)
            {
                sum_parcel+=ar[i];  //ar[6]值为几 包裹加几个
                ar[i]=0;    //然后设为零值
            }
            else if(i==5)
            {
                sum_parcel+=ar[i];   //ar[5]有几个就需要多几个包裹,
                int blank_area=11*ar[i];  //包裹剩余的空间只能用来 放1*1点箱子
                ar[i]=0;
                if(blank_area>=ar[1])
                {
                    ar[1]=0;
                }
                else
                {
                    ar[1]=ar[1]-blank_area;
                }

            }
            else if(i==4)
            {
                sum_parcel+=ar[i];   //同理讨论一个包裹装上一个4*4点箱子
                                        //此时还可以装的箱子的种类有 :2*2、1*1
                int blank_area=ar[i]*20;  //一下语句为 对它们的讨论
                ar[i]=0;
                if(blank_area>=ar[2]*4)
                {
                    blank_area-=ar[2]*4;
                    ar[2]=0;

                    if(blank_area>=ar[1])
                    {
                        ar[1]=0;
                    }
                    else
                    {
                        ar[1]=ar[1]-blank_area;
                    }
                }
                else
                {
                    ar[2]=(ar[2]*4-blank_area)/4;
                }


            }
            else if(i==3)   //当在一个包裹中 装了一个3*3之后
                            //还可以装的箱子种类有3*3、2*2、1*1
                            //以下为对它们的讨论
            {
                if(ar[i]%4==0)
                {
                    sum_parcel+=ar[i]/4;
                    ar[i]=0;

                }
                else if(ar[i]%4!=0)
                {
                    sum_parcel+=ar[i]/4+1;
                    if(ar[2]<=5)
                    {
                        int blank_area=(4-ar[i]%4)*9-4*ar[2];
                        ar[i]=0;
                        ar[2]=0;
                        if(blank_area>=ar[1])
                        {
                            ar[1]=0;
                        }
                        else
                        {
                            ar[1]=ar[1]-blank_area;
                        }
                    }
                    else if(ar[2]>5)
                    {
                        ar[2]-=5;
                        ar[i]=0;
                    }
                    
                }
                //printf("i=%d",ar[i]);
            }
            else if(i==2)
            {
                int sum_2_area=4*ar[i];
                if(sum_2_area%36!=0)
                {
                    sum_parcel+=sum_2_area/36+1;
                    int blank_area=36*(sum_2_area/36+1)-4*ar[i];
                    ar[i]=0;
                    if(blank_area>=ar[1])
                    {
                        ar[1]=0;
                    }
                    else
                    {
                        ar[1]=ar[1]-blank_area;
                    }
                }
                else
                {
                    sum_parcel+=sum_2_area/36;
                    ar[i]=0;
                }

            }
            else if(i==1)
            {
                if(ar[i]>36)
                {
                    sum_parcel+=ar[i]/36+1;
                }
                else
                {
                    sum_parcel+=1;
                }

            }

        }
    }
    printf("%d",sum_parcel);

    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值