1091: 3007 装箱问题(贪心)

题目描述

一个工厂生产的产品形状都是长方体,高度都是h,主要有1 * 1,2 * 2,3 * 3,4 * 4,5 * 5,6 * 6等6种。这些产品在邮寄时被包装在一个6 * 6 * h的长方体包裹中。由于邮费很贵,工厂希望减小每个订单的包裹数量以增加他们的利润。因此他们需要一个好的程序帮他们解决这个问题。你的任务就是设计这个程序。

输入

输入包括多组测试数据,每一行代表一个订单。每个订单里的一行包括六个整数,用空格隔开,从小到大分别为这6种产品的数量。6个0表示文件结束。

输出

针对每个订单输出一个整数,占一行,代表对应的订单所需的最小包裹数。没有多余的空行。

样例输入 复制

0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0

样例输出 复制

2
1

这个题的思路就是从大到小一个一个算 给2和1留出空位 

#include <iostream>
using namespace std;

void _3007_()
{
    int a, b, c, d, e, f;
    while (1)
    { 
        int h = 0;
        scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);
        if (a + b + c + d + e + f == 0)break;
        
        //对f
        h += f;

        //对e
        h += e;
        int leftfortwo = 5 * e;
        int leftforone = e;

        //对d
        h += d;
        leftfortwo += 10 * d;

        //对c
        h += (c + 3) / 4;
        if (c % 4 == 1)
        {
            leftfortwo += 13 * ((c + 3) / 4);
            leftforone += (c + 3) / 4;
        }
        else if (c % 4 == 2)
            leftforone += 9 * ((c + 3) / 4);
        else if (c % 4 == 3)
        {
            leftfortwo += 4 * ((c + 3) / 4);
            leftforone += ((c + 3) / 4);
        }

        //对b
        if (b <= leftfortwo)
        {
            leftforone += (leftfortwo - b) * 2;
        }
        else
        {
            h += (b - leftfortwo) / 18 + 1;
        }

        //对a
        if (a > leftforone)
        {
            h += (a - leftforone) / 36 + 1;
        }
        cout << h << endl;
    }

}


int main()
{
    _3007_();
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值