小于哥的鱼干


私信TA

用户名:yuhui1207

访问量:18177

签 名:

在人间已是巅,何苦要上青天

等  级
排  名 414
经  验 5013
参赛次数 2
文章发表 32
年  龄 24
在职情况 在职
学  校 常熟理工
专  业

  自我简介:

解题思路:
     简单贪心算法

    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;
}


 

0.0分

8 人评分

  评论区

  • «
  • »