PKU 1017 Packets

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章