題目鏈接: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;
}