I♥TLE

Java、オンラインジャッジなど

1017-Packets

問題(外部リンク)

1017 -- Packets

実装の概要

使用できる箱の大きさが6*6と決まっているので、まずはサイズが6*6である荷物の数だけ小包が増えます。
同様に5*5の場合も荷物と同じ数だけ小包が増えますが、こちらは隙間の各11マスも活用することができます。ただしここに入れることができるのはサイズが1*1のもののみです。
以降もこのようになるべく大きい荷物を入れて余ったスペースに小さい荷物を入れますが、終わりに近づくほど分岐が複雑になるので注意です。

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		while(true){
			String input = br.readLine();
			if(input.equals("0 0 0 0 0 0")){
				break;
			}

			String[] tmpArray = input.split(" ");

			int num[] = new int[6];

			for(int i = 0; i < 6; i++){
				num[i] = Integer.parseInt(tmpArray[i]);
			}

			System.out.println(solve(num));
		}
	}

	static int solve(int num[]){
		int packets = 0;

		//6*6
		packets += num[5];

		//5*5
		packets += num[4];
		if(num[0] > num[4] * 11){
			num[0] -= num[4] * 11;
		}
		else {
			num[0] = 0;
		}

		//4*4
		packets += num[3];
		int cap2 = num[3] * 5;
		int cap1 = num[3] * 20;

		int pack2 = Math.min(num[1], cap2);
		num[1] -= pack2;
		cap1 -= pack2*4;

		int pack1 = Math.min(num[0], cap1);
		num[0] -= pack1;

		//3*3
		packets += num[2] / 4;
		if(num[2] % 4 == 1){
			cap2 = 5;
			cap1 = 27;
		}
		else if(num[2] % 4 == 2){
			cap2 = 3;
			cap1 = 18;
		}
		else if(num[2] % 4 == 3){
			cap2 = 1;
			cap1 = 9;
		}

		if(num[2] % 4 > 0){
			packets++;
			pack2 = Math.min(num[1], cap2);
			num[1] -= pack2;
			cap1 -= pack2*4;

			pack1 = Math.min(num[0], cap1);
			num[0] -= pack1;
		}

		//2*2 || 1*1
		packets += Math.ceil((num[1]*4 + num[0])/36.0);


		return packets;
	}

}