注意理解題意……我把討論區的測試數據翻來覆去看了好幾遍才明白過來,要裝的邊長爲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;
}