问题描述:
个人结题思路:首先确定的一点是不用考虑高度(也就是不考虑体积),因此,问题就大大简单了,相当于二维面积问题。如果这个不是编程题,看成数学题,很自然的我们肯定先从大件的开始计算需要的包装箱个数(大于等于3*3的商品,因为2*2和1*1的商品在前面的5*5、4*4、3*3的剩余空间可以放,这也是关键点),空下的用来装小的,因为商品是不能拆分的。这其中有一点是剩下的空间优先装2*2的商品,因为一个2*2的空间可以装4个1*1的。这就是大体思路。
我写的代码:
#include<stdio.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)
{
int sum = 0; //存放箱子个数
int x = 0; //存放可以放2*2的箱子的个数
int y = 0; //存放可以放1*1的箱子的个数
if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
break;
else
{
sum=f+e+d+(c+3)/4;
x+=d*5;
y+=e*11;
if(c%4!=0)
{
switch(c%4){
case 1:x+=5;y+=7;break;
case 2:x+=3;y+=6;break;
case 3:x+=1;y+=5;break;
}
}
if(b>x)
{
sum+=(b-x+8)/9;
if((b-x)%9!=0)
{
y+=(9-(b-x)%9)*4;
}
}
else
{
y+=(x-b)*4;
}
if(a>y)
{
sum+=(a-y+35)/36;
}
}
printf("%d\n",sum);
}
return 0;
}
参考代码:
#include<cstdio>
int main()
{
int n,a,b,c,d,e,f,x,y;
//n表示需要的箱子
//x表示1*1的空位数
//y表示2*2的空位数
int u[4] = {0,5,3,1};
//表示3*3的产品分别是4K,4K+1,4K+2,4K+3时,为3*3产品打开的新箱子中剩余2*2的空位数
while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=EOF)
{
if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
break;
n = f+e+d+(c+3)/4;
y = 5*d + u[c%4];
//长宽大于或等于3*3的产品所占的新箱子数目
if(b > y)
n += (b-y+8)/9; //多出来的2*2箱子应该占用的新箱子数
x = 36*n - 36*f - 25*e - 16*d - 9*c - 4*b;
//所有箱子剩下的1*1空格
if(a>x)
n+=(a-x+35)/36;
printf("%d\n",n);
}
return 0;
}
小结:跟参考代码比较,虽然提交时都通过,运行时间相同,但是参考代码的代码长度少,这个也很显然啊,我写的不好读,啰嗦,不简洁。其一:在计算3*3的商品所占用箱子数时,我是通过一个switch语句,它是通过一个数组,然后一个表达式就计算好了,这是一个很好点;其二:其实,仔细观察,我代码长的主要原因是存放1*1的y更新值占了很多行,它只用了一条语句就计算好了,总面积-所用面积。这两个点都值得学习,同样的效果,当然是简洁、逻辑清晰的好。