1 条题解

  • 0
    @ 2025-7-13 18:45:23

    🧠 解题思路(贪心策略)

    我们从大的物品优先处理(贪心策略),这样可以尽量减少剩余空间的碎片。

    ✅ 步骤如下:

    先处理所有的 6×66\times6 包: 一个 6×66\times6 的物品刚好占满一个箱子,占用 3636 单位空间。

    然后处理 5×55\times5 的包:

    每个 5×55\times52525 单位空间,还剩 1111,可以放 11111×11\times1

    然后是 4×44\times4 的包:

    每个 4×44\times41616 单位空间,还剩 2020,可以放最多 552×22\times2,剩下用 1×11\times1 补足。

    3×33\times3 的处理稍复杂:

    443×33\times3 正好可以填满一个箱子(4×9=364\times9=36)。

    若不足 44 个,需要进行分类讨论,组合剩下的位置尽可能用 2×22\times2,再用 1×11\times1 补空。

    2×22\times2 的处理:

    每个 2×22\times244 单位,一个箱子最多可放 99 个(9×4=369\times4=36)。

    1×11\times1 的处理:

    一个箱子最多可装 36361×11\times1

    代码实现

    #include <iostream>
    using namespace std;
    
    int seq[4]={0,5,3,1};//表示分配完3*3产品剩余3*3产品数对应剩余2*2的空位数
    int main()
    {
        int product[6],packets,twos,ones;
        bool flag;
        while(true)
        {
            int i;
            flag=false;
            for(i=0;i<6;i++)
            {
                cin>>product[i];
                if(product[i]>0) flag=true;
            }
            if(!flag) break;
    
            packets = product[5]+product[4]+product[3]+(product[2]+3)/4;
            twos = product[3]*5+seq[product[2]%4];
            if(product[1]>twos)
            {
                packets += (product[1]-twos+8)/9;
            }
            ones = 36*packets-36*product[5]-25*product[4]-16*product[3]-9*product[2]-4*product[1];
            if(product[0]>ones)
            {
                packets += (product[0]-ones+35)/36;
            }
            cout<<packets<<endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    18
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者