参考原文请点击打开链接
题目描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量。输入文件将以6个0组成的一行结尾。
输出
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
样例输入
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
样例输出
2
1
思路解析:
我们知道—— 6 * 6 、 5 * 5 、 4 * 4 以及 3 * 3 的数量除以4向上取整的数量之和是它们必须占用的箱子数量,于是我们可以预先算出这一结果。我们把 1 * 1 和 2 * 2 的盒子用于“塞缝”。对于 2 * 2 的盒子,可以“给 4 * 4 盒子塞缝”,一个4 * 4 盒子的空隙能用5个 2 * 2 盒子填满;3 * 3 盒子空隙所需要的 2 * 2 盒子个数可以用一个数组存。1 * 1 的盒子用来最后填缝。
若空隙已经填满了,还剩余了 1 * 1 和 2 * 2 的盒子,此时需要先处理2*2的盒子,按照9个 2 * 2 盒子装满1个箱子的规则,计算需要额外几个箱子,最后计算1 * 1 盒子。从而计算出答案。
代码:
public static void Souhu2()
{
Scanner in = new Scanner(System.in);
int a[]=new int[6];
while(in.hasNext())
{
int count=0;
for(int i=0;i<6;i++)
{
a[i]=in.nextInt();
if(a[i]==0)
count++;
if(count>=6)
return;
}
int N=0;
int y=0,x=0;
int temp[]={0,5,3,1};// temp[0]无意义,temp[i]:箱子中有i个3*3的商品时还可以放多少个2*2的箱子个数
N=a[5]+a[4]+a[3]+(a[2]+3)/4;//计算必须占用的箱子数量
y=5*a[3]+temp[a[2]%4];// 因为5*5和6*6盒子填充的箱子无法用2*2的盒子填充缝隙,
//因此只需要计算4*4和3*3盒子填充的箱子理论上需要多少个2*2的盒子才能填满
if(a[1]>y)
N=N+(a[1]-y+8)/9;
x=36*N-36*a[5]-25*a[4]-16*a[3]-9*a[2]-4*a[1];
if(a[0]>x)
N=N+(a[0]-x+35)/36;
System.out.println(N);
}
}