POJ1017 装箱问题

 
  

总时间限制: 
1000ms 
内存限制: 
65536kB
描述
一个工厂制造的产品形状都是长方体,它们的高度都是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 
import java.util.Scanner;


public class POJ1017 {

	public static boolean isNotEnd(int a[]){
		for(int b : a){
			if(b != 0)
				return true;
		}
		return false;
	}
	
	public static void solve(int a[]) {
		if(!isNotEnd(a)) return;
		int remain[] = new int [3];
		int r = 0;
		r += a[2]/4 + a[3] + a[4] + a[5];

		if(a[2]%4 !=0){
			r++;
		}
		remain[2] = a[2]%4;
		remain[1] = a[1];
		remain[0] = a[0];

		if(remain[2] == 1){
			remain[1] -= a[3]*5 + 5;
		}else if(remain[2] == 2) {
			remain[1] -= a[3]*5 + 3;
		}else if(remain[2] == 3){
			remain[1] -= a[3]*5 + 1;
		}else {
			remain[1] -= a[3]*5;
		}
		if(remain[1]>0) r += Math.ceil(remain[1]/9.0);

		remain[0] -= 36*r - (4*a[1] + 9*a[2] + 16*a[3] + 25*a[4] + 36*a[5]);
		if(remain[0]>0) r += Math.ceil(remain[0]/36.0);
		System.out.println(r);
	}

	public static void main(String[] args){
		int a[] = new int [6];
		Scanner sc = new Scanner(System.in);
		
		do{		
			for(int j=0; j<6; j++){
				a[j] = sc.nextInt();
			}
			solve(a);	
		}while(isNotEnd(a));

	}
}

WA了一下午,哎!在输出样例中,
0 0 4 0 0 1 
7 5 1 0 0 0 
0 0 0 0 0 0 
不是全部算好了再一起输出,而是输入一行算一行,紧接着输出一行,六个0表示程序退出。比如:

while(1){

//输入

//是否退出

//求解

//输出

}

如上样例,这个循环应有三次。下面这样写是错误的:

//输入全部数据,二维数组储存

//求解

//二维数组输出

你可能感兴趣的:(OJ)