装箱问题POJ1017

问题描述:

个人结题思路:首先确定的一点是不用考虑高度(也就是不考虑体积),因此,问题就大大简单了,相当于二维面积问题。如果这个不是编程题,看成数学题,很自然的我们肯定先从大件的开始计算需要的包装箱个数(大于等于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更新值占了很多行,它只用了一条语句就计算好了,总面积-所用面积。这两个点都值得学习,同样的效果,当然是简洁、逻辑清晰的好。

猜你喜欢

转载自blog.csdn.net/qq_41045071/article/details/81589382