解题思路:
     简单贪心算法

    1. 6*6的产品每个会占用一个完整的箱子,并且没有空余空间

    2. 5*5的产品每个占用一个新的箱子,并且留下 11 个可以盛放 1*1的产品的空余空间

    3. 4*4的产品每个占用一个新的箱子,并且留下5 个可以盛放2*2 的产品的空余空间

    4. 3*3的产品情况比较复杂,首先3*3 的产品不能放在原来盛有5*5 或者4*4 的箱子中,那么必须为3*3 的产品另开新的箱子,新开的箱子数目等于3*3 的产品的数目除以4向上取整

    同时需要讨论为3*3 的产品新开箱子时,剩余的空间可以盛放多少2*2 和 1*1 的产品

    1. 3*3 的产品的数目好是4的倍数,这时还剩0个2*2的空位

    2. 3*3 的产品数目是4 的倍数加1,这时还剩5个2*2的空位和7个1*1的空位;

    3. 3*3 的产品数目是4 的倍数加2,这时还剩3个2*2的空位和6个1*1的空位;

    4. 3*3 的产品数目是4 的倍数加3,这时还剩1个2*2的空位和5个1*1的空位;

    处理完3*3的产品,就可以比较一下剩余的2*2的空位和2*2产品的数目,如果产品数目多,就将2*2 的空位全部填满,再为2*2 的产品打开新箱子

    比较一下剩下空间与1*1 的产品数目,如果空位多,将1*1的产品全部填入空位,否则,先将1*1的空 位填满,然后再为 1*1 的产品打开新的箱子。


注意事项:
    参考了别人的攻略,整理下来,经常看看,总有一天自己也会成为这样的大牛!

    优先考虑大箱子和刚好塞满的情况,要不怎么说贪心呢
参考代码:

#include<stdio.h>
int main(){
    int n,a,b,c,d,e,f,x,y;   //n用来存储需要的箱子数目,y用来存储 2*2 的空位数目
							// x 用来存储 1*1 的空位数目。
    int u[4]={0,5,3,1};
	//数组u 表示3*3 的产品数目分别是 4的倍数,4 的倍数+1, 4 的倍数+2, 4的倍数+3时   
	//为3*3的产品打开的新箱子中剩余的 2*2的空位的个数 
    while(1){
        scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
        if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
            break;
        n=d+e+f+(c+3)/4;        //较大的产品只能自己开箱,无法放入更大的箱子中
		//(c+3)/4 正好等于 c 除以4向上取整的结果
        y=5*d+u[c%4];	//每一个4*4的箱子装过后还可以再装5个2*2的箱子 
				//还有3*3的箱子如果没填满6*6的箱子的话,也可以用来装2*2的箱子  
					//5*5的箱子则只能装1*1的情况了
        if(b>y)//如果要装的2*2的箱子的数目比提供的空间要多
            //那么多的部分要新开一些箱子 
            n+=(b-y+8)/9; //(b+8)/9 向上取整
     
        x=36*n-36*f-25*e-16*d-9*c-4*b; //多出来的面积即1*1的空位数目
        if(a>x)            //空间不够则新开箱
            n+=(a-x+35)/36;  //向上取整
        printf("%d\n",n);
    }
    return 0;
}


点赞(7)
 

0.0分

7 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论