(一般)POJ-1017 装载问题

题目大意:

一个工厂制造的产品形状都是长方体盒子,它们的高度都是 h,长和宽都相等,一共有六个型号,分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。

这些产品通常使用一个 6*6*h 的长方体箱子包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的箱子数量BoxNum。


题目链接:点击打开链接


分析:这题h实际并无卵用,可以忽略。由于这题的尺寸规模比较小,所以我们可以定性地考虑,用a[i]表示i*i的个数。先考虑4*4, 5*5, 6*6这3种,每一个都需要一个新的箱子来装,然后对于3*3的,肯定不能和4*4, 5*5, 6*6的公用一个箱子,所以每4个3*3的便需要一个箱子,所以先求出4*4, 5*5, 6*6和3*3所需要的箱子数,然后先考虑2*2的,因为之前的装法(即某个物品在箱子中放的位置)并不影响最终1*1的放置。一个装4*4的箱子最多还可以容下5个2*2的,而3*3的则比较特殊,取决与最终a[3]%4的结果,我们用u[4]将4种情况记录下来,分别为可以装下0,5,3,1个2*2的,记总和为now2。然后比较a[2]与now2的关系,if a[2]>now2 那么说明空余的空间装不下2*2的,需要另外再加箱子。然后求最终剩下多少空间,这个就很好算了,直接用箱子总数ans*36-当前已经使用的空间总和,记now1,再与a[1]比较就行了。


附上代码:

#include        //POJ-1017
using namespace std;
int a[8], ans;
int u[4] = { 0, 5, 3, 1 };    //u[i]表示a[3]%4为i时空余空间可以装下2*2的个数
int main()
{
	while (cin >> a[1] >> a[2] >> a[3] >> a[4] >> a[5] >> a[6] && (a[1] || a[2] || a[3] || a[4] || a[5] || a[6]))
	{
		ans = 0;
		ans += a[6] + a[5] + a[4] + (a[3] + 3) / 4;   //(a[3]+3)/4可以往上进位,例如a[3]=1时结果也为1个箱子
		int now2 = a[4] * 5 + u[a[3] % 4];
		if (a[2] > now2) ans += (a[2] - now2 + 8) / 9;
		int now1 = ans * 36 - a[6] * 36 - a[5] * 25 - a[4] * 16 - a[3] * 9 - a[2] * 4;
		if (a[1] > now1) ans += (a[1] - now1 + 35) / 36;
		cout << ans << endl;
	}
	return 0;
}


你可能感兴趣的:(算法)