POJ 1017——Packets

題目鏈接:http://poj.org/problem?id=1017

高只是擺設,題目只是平面填圖,翻譯過來就是,有1*1,2*2,3*3,4*4,5*5,6*6六種紙板,給出這幾個面板的數量,問最少需要多少個6*6紙框才能裝完,不才,只能一步一步模擬。

思路:6*6只能單獨裝成一個,一個5*5可以附帶11個1*1,一個4*4可以附帶5個2*2或若干個2*2和若干個1*1,3*3的因爲可能造成空缺,只能單獨留出來,先塞2*2的,再塞1*1的。

代碼流程:4,5,6每一個都要單獨分出一個紙箱來裝,加到count裏,裝5*5的紙箱能裝11個1*1,5*5的紙箱數量乘以11就是可以順便帶走的1*1數量,若1*1的數量大於這個數,則減去這個數,否則1*1的紙箱數量置零;裝4*4的紙箱可以附帶5個2*2,4*4的紙箱數量乘以5就是可以順便帶走的2*2的數量,若2*2的數量大於這個數,則減去這個數,否則2*2的紙箱數量置零,剩下的用1*1填,判斷同上;把1*1的數量對36取餘,把2*2的數量對9取餘,把3*3的數量對4取餘,因爲36個1*1或9個2*2或4個3*3剛好能一起裝入6*6的紙箱,剩下的3*3的數量範圍是0~4,數量是0則跳過,一個6*6紙箱能帶走1個3*3和5個2*2或2個3*3和3個2*2或3個3*3和1個2*2,不足用1*1填,判斷同上;剩下的1*1和2*2不會造成無法填補的空缺,把它們的面積加起來對36取餘判斷,若剛好等於0,則需要的箱子是面積/36,否則是面積/36+1。

慘不忍睹的AC代碼如下:

#include<stdio.h>
int main()
{
	int a[7];
	int sum;
	int count;
	int i;
//	freopen("d://in.txt","r",stdin);
	for(i=1,sum=0;i<7;i++){
		scanf("%d",&a[i]);
		sum=sum+a[i];
	}
	while(sum!=0){
		count=0;
		count=a[6]+a[5]+a[4];
		if(a[5]!=0){
		    if(a[1]>=a[5]*11){
			    a[1]=a[1]-a[5]*11;
		    }
		    else{
			    a[1]=0;
		    }
		}
		if(a[4]!=0){
		    if(a[2]>=a[4]*5){
			    a[2]=a[2]-a[4]*5;
		    }
		    else{
		     	if(a[1]>=a[4]*5*2*2-a[2]*2*2){
			    	a[1]=a[1]-(a[4]*5*2*2-a[2]*2*2);
		     	 }
			    else{
			 	    a[1]=0;
			    }
			    a[2]=0;
		    }
	    }
		count=count+a[3]/4+a[2]/9+a[1]/36;
		a[3]=a[3]%4;
		a[2]=a[2]%9;
		a[1]=a[1]%36;
		if(a[3]>0){
			count++;
		    if((36-a[3]*3*3-8+a[3])/4<=a[2]){
			    a[2]=a[2]-(36-a[3]*3*3-8+a[3])/4;
			    if(a[1]>=7){
				    a[1]=a[1]-7;
			    }
			    else{
				    a[1]=0;
			    }
		    }
		    else{
			    if(a[1]>=36-a[3]*3*3-a[2]*2*2){
				    a[1]=a[1]-(36-a[3]*3*3-a[2]*2*2);
			    }
			    else{
				    a[1]=0;
		    	}
		    	a[2]=0;
		    }
     	}
		sum=a[1]+a[2]*2*2;
		if(sum%36==0){
			count=count+sum/36;
		}
		else{
			count=count+sum/36+1;
		}
		printf("%d\n",count);
		for(i=1,sum=0;i<7;i++){
		    scanf("%d",&a[i]);
		    sum=sum+a[i];
  	    }
  	}
  	return 0;
} 

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