1 条题解

  • 0
    @ 2025-2-14 21:11:41

    C :

    #include<stdio.h>
    int main()
    {
        int b6,b5,b4,b3,b2,b1; //不同大小的木块个数
        int nTotal = 0; //最少需要的箱子数目
        int c1; //当前能放 1*1 木块的空格数目
        int c2; //当前能放 2*2 木块的空格数目
        int Contain2[4] = { 0, 5, 3, 1 }; //记录被3*3的占用之后,还剩多少给2*2的使用
        while(1)
        {
            scanf("%d%d%d%d%d%d",&b1,&b2,&b3,&b4,&b5,&b6);//输入1*1到6*6箱子的个数
            if (b1 == 0 && b2 == 0 && b3 == 0 && b4 == 0&& b5 == 0 && b6 == 0)
                break;
            nTotal = b6 + b5 + b4 + (b3 + 3)/4;   //只能装1个6*6的,1个5*5的,1个4*4的,而3*3的需要多情况考虑,3*3的需要向上调整,你懂的。。。。。
            //这里有一个小技巧 (b3+3)/4 正好等于b3除以4向上取整的结果,下同
            c2 = 5 * b4 + Contain2[b3 % 4];  //放2*2的数目等于放一个4*4时需要5个2*2加上放1到4个3*3时各需要的数目 ,即还可以装多少个2*2的
            if(b2 > c2)
                nTotal += (b2 - c2 + 8 ) / 9; //向上调整 ,总的2*2的个数减去装过的2*2的个数,得到剩余的2*2的个数,此个数加上8然后除以9就正好等于它除以9向上取整的结果,之所以总数要加上这个数是由于若单独装2*2,可以装9个
            c1 = 36 * nTotal - 36 * b6 - 25 * b5 - 16 * b4 - 9 * b3 - 4 * b2;  //还可以装多少个1*1的,妙啊!
            if(b1 > c1)
                nTotal += ( b1 - c1 + 35 ) / 36; //向上调整 ,总的1*1的个数减去装过的1*1的个数,得到剩余的1*1的个数,此个数加上35然后除以36就正好等于它除以36向上取整的结果,之所以总数要加上这个数是由于若单独装1*1,可以装36个
           printf("%d\n",nTotal);
        }
        return 0;
    }
    
    

    C++ :

    /*  题目思路,对于6*6,5*5以及4*4尺寸的物品每个物品需要占有一个箱子,
        对于3*3的物品一个箱子可以放4个,
        2*2的物品箱子可以放9个,
        1*1的可以放36个。
        采用面积统计1*1箱子的空位,采用向上去整的方法统计箱子。
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    int num[4]={0,5,3,1};//一个6*6箱子可装:1个box[3]+5个box[2],2个box[3]+3个box[2],3个box[3]+1个box[2]
    int box[7];
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        while(1){
            int tmp=0;
            for(int i=1;i<=6;i++){
                scanf("%d",&box[i]);    // 读入每个物品的数目
                tmp+=box[i];
            }
            if(tmp==0)
                break;
            int ans=box[6]+box[5]+box[4]+(box[3]+3)/4;  //a6,a5,a4,每个物品占有一个箱子(a3 + 3 ) / 4 代表a3的物品需要占
            int a2=box[4]*5+num[box[3]%4];  //统计所有的大物品放进箱子中后a2物品的空位子有多少
                                            //box[4]*5表示一个6*6箱子可装:1个box[4]+5个box[2]
            if(box[2]>a2)
                ans+=(box[2]-a2+8)/9;//一个箱子可以放:1个box[4]+5个box[2],一个box[3]+5个box[2],求装满box[3]和box[4]后,剩余箱子box[2]可以装几个箱子
            int a1=ans*36-box[6]*36-box[5]*25-box[4]*16-box[3]*9-box[2]*4;
            if(box[1]>a1)   //求a1的空位子,只需要统计剩余的面积即可
                ans+=(box[1]-a1+35)/36;
            printf("%d\n",ans);
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    702
    时间
    1000ms
    内存
    10MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者