zoukankan      html  css  js  c++  java
  • YBT 装箱问题

    题目描述

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

     

    输入格式

            输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量。输入文件将以6个0组成的一行结尾。

    输出格式

            除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。

     

    输入样例

    0 0 4 0 0 1

    7 5 1 0 0 0

    0 0 0 0 0 0

    输出样例

    2

    1

    题解

             容易想到的贪心思路:

             (1)放3*3,4*4,5*5,6*6

             (2)用1*1填充放5*5箱子的剩余空间

             (3)先用2*2填充放4*4箱子的剩余空间,再用1*1填充放4*4箱子的剩余空间

             (4)先用2*2填充放3*3箱子的剩余空间,再用1*1填充放3*3箱子的剩余空间

             (5)把4个1*1看作1个2*2,最后多出来的1*1也看作1个2*2,这样就把所有的1*1转化成2*2

             (6)放剩余的2*2

    #include <iostream>
    
    using namespace std;
    
    int a, b, c, d, e, f;
    int ans;
    
    int main()
    {
        int tmp;
        while(cin >> a >> b >> c >> d >> e >> f && (a || b || c || d || e || f))
        {
            ans = (c + 3) / 4 + d + e + f;
            a = max(0, a - e * 11);
            tmp = max(0, d * 5 - b);
            b = max(0, b - d * 5);
            a = max(0, a - tmp * 4);
            c %= 4;
            if(c)
            {
                tmp = max(0, (5 - (c - 1) * 2) - b);
                b = max(0, b - (5 - (c - 1) * 2));
                a = max(0, a - tmp * 4);
                a = max(0, a - (7 - (c - 1) * 2));
            }
            ans += ((a + 3) / 4 + b + 8) / 9;
            cout << ans << "
    ";
        }
        return 0;
    参考程序

             根据上面我们可以看出,2*2只需要用来填充放4*4和3*3的箱子,那我们也可以先算出填充完后剩余的2*2还需要多少个箱子。此时我们先更新$ans$。

            容易想到,其实1*1需要填充的数量也就是$ans imes 36$再减去其它大小产品所占的空间。我们最后再加上填充完后剩余的1*1还需要多少个箱子即可。

    #include <iostream>
    
    using namespace std;
    
    const int t[4] = {0, 5, 3, 1};
    int a, b, c, d, e, f;
    int ans;
    
    int main()
    {
        int tmp;
        while(cin >> a >> b >> c >> d >> e >> f && (a || b || c || d || e || f))
        {
            ans = f + e + d + (c + 3) / 4;
            ans += (max(0, b - d * 5 - t[c % 4]) + 8) / 9;
            ans += (max(0, a - ans * 36 + b * 4 + c * 9 + d * 16 + e * 25 + f * 36) + 35) / 36;
            cout << ans << "
    ";
        }
        return 0;
    }
    参考程序
  • 相关阅读:
    第09组 Alpha冲刺 (2/6)
    第08组 Beta冲刺 (1/5)
    第08组 Alpha冲刺 总结
    第08组 Alpha冲刺 (6/6)
    第08组Alpha冲刺(5/6)
    第08组 Alpha冲刺 (4/6)
    第08组 Alpha冲刺 (3/6)
    第08组 Alpha冲刺 (2/6)
    第08组 Alpha冲刺 (1/6)
    第12组 Beta冲刺(2/5)
  • 原文地址:https://www.cnblogs.com/kcn999/p/10925435.html
Copyright © 2011-2022 走看看