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; } }