j - j 贪心

题目

有一个盒子工厂生产不同大小的正方体盒子,尺寸分别是 11, 22, 33, 44, 55, 66,这些盒子都放到一个6*6大小的正方体包装盒里里来邮寄给客户,工厂希望能用尽可能少包装盒的来装客户需要的盒子以此来降低成本。现在需要你来写一个程序,计算对于某一个客户的订单最少需要几个包装盒。

输入

输入数据包含多行,每一行六个数代表一份订单,每个数直接用空格分开,依次表示从11尺寸到66尺寸的各个尺寸盒子的需求数量,输入末尾由6个0表示结束输入

  • 样例:
    0 0 4 0 0 1
    7 5 1 0 0 0
    0 0 0 0 0 0

输出

对于每一行输入数据(即每个订单)你都需要输出一行代表该订单最少需要的包装盒数量,对于6个0的输入程序不需要输出任何数据

  • 样例:
    2
    1

题解:

首先理解题意:装的时候只考虑底面积6*6,高度相同

  • 贪心方法:从大到小装,从大到小搭配
    先装规格6 * 6、5 * 5、4 * 4的(一个6 * 6的包裹只能装其中一个)
    每个5 * 5的可以搭配11个1 * 1的箱子
    每个4 * 4的可以搭配5个2 * 2的箱子或20个1 * 1的箱子
    每4个3 * 3的箱子正好共用一个包裹
    对于多出来的(1,2,3)搭配2 * 2 和 1 * 1的箱子
    同理多出来的 2 * 2 与 1 * 1的箱子

代码:

#include<stdio.h>

int main(){
    int x1, x2, x3, x4, x5, x6;
    int a[] = {0, 5, 3, 1};
    while(scanf("%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6)!=EOF){
        if(x1 == 0 && x2 == 0 && x3 == 0 && x4 == 0 && x5 == 0 && x6 == 0){
            return 0;
        }
        int sum = 0;
        int temp5 = 0;
        int temp4 = 0;
        int temp3 = 0;
        int temp2 = 0;
        sum += x6; x6 -= x6;

        sum += x5;  temp5 = ( 6 * 6 - 5 * 5 ) * x5;//表示目前x5包裹中的剩余空间
        x5 -= x5;
        while(temp5 > 0 && x1 > 0){
            temp5 --; x1 --;
        }

        sum += x4; temp4 = ( 6 * 6 - 4 * 4 ) * x4;//目前x4包裹中的剩余空间
        x4 -= x4;
        while(temp4 > 0 && x2 > 0){
            temp4 -= 2*2; x2--;
        }
        while(temp4 > 0 && x1 > 0){
            temp4--; x1--;
        }

        sum += x3/4; x3 %= 4;
        if(x3 > 0){
            sum++;
            temp3 = 6 * 6 - 3 * 3 *x3;//目前x3包裹中的剩余空间
            //装x2:
            x2 -= a[x3]; 
            temp3 -= a[x3] * 4;
            //装x1:
            while(temp3 > 0 && x1 > 0){
                temp3 --; x1 --;
            }
        }

        sum += x2/9; x2 %= 9;
        if(x2 > 0){
            sum++;
            temp2 = 6 * 6 - x2 * 4;
            while(temp2 > 0 && x1 > 0){
                temp2 --; x1 --;
            }
        }

        sum += x1/36; x1 %= 36;
        if(x1 > 0){
            sum++;
        }
        printf("%d\n", sum);
    }
}

待优化:

-可将每次分支多出来的空间汇总,最后与x2、x1 大小作比较统一计算sum的数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值