2018搜狐编程题-贪心算法-二维装箱问题

参考原文请点击打开链接

题目描述

一个工厂制造的产品形状都是长方体,它们的高度都是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 


样例输出


思路解析:

我们知道—— 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);
		}
	}


你可能感兴趣的:(面试总结)