题目链接: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;
}