注意理解题意……我把讨论区的测试数据翻来覆去看了好几遍才明白过来,要装的边长为1、2、3、4、5、6的箱子都是不可形变的长方体,也就是说一个6*6的箱子里面不可能放下两个4*4的物体,虽然4*4+4*4 = 32 < 36,但是4+4= 8 > 6.
另外注意不要先把2*2的箱子9个9个的凑对,因为每个6*6的箱子最多只能装一个6*6或5*5或4*4的,而一个箱子一旦装了3*3的,剩下的必然是2*2或者1*1的,我们先把基础的箱子个数分好(以a b c d e f 分别代表边长123456),tmp = f + e + d + c/4
之后先把2*2的尽量装到用过的箱子里面,最后实在装不下了再给他单独分箱子
至于1*1的,它是革命的一块砖,哪里需要往哪搬~~
代码如下:
#include<stdio.h>
#include<math.h>
int main(){
int a,b,c,d,e,f;
while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!= EOF){
if(a+b+c+d+e+f == 0) break;
int tmp,ctmp,btmp,space,buse;
tmp = f + e + d + c/4; //基本的箱子个数
space = e*11 + d*20;
if(d*5 > b){ //将2*2的插到4*4里面去,一个4*4最多可以装5个2*2
btmp = 0;
space -= b*4;
}
else{
btmp = b - d*5;
space -= d*5*4;
}
ctmp = c%4;
if(ctmp>0){ //将2*2插到3*3里面
tmp+=1;
space += (36-ctmp*9);
buse = 7 - 2*ctmp; // 3个3*3装1个2*2,2个3*3装3个2*2,3个3*3装5个2*2,用等差数列求解吧
if(btmp>buse){
space -= buse*4;
btmp-=buse;
}
else{
space -= btmp*4;
btmp = 0;
}
}
if(btmp >0){ //给剩下的2*2分箱子
tmp+= (btmp+8)/9;
space += ((9-btmp%9)*4);
}
a -= (a>space)? space: a; //处理1*1
tmp+= a/36;
if(a%36) tmp+=1;
printf("%d\n",tmp);
}
return 0;
}