编程语言:Java
题目链接:http://poj.org/problem?id=1017http://poj.org/problem?id=1017
题解:题解见注解,更清晰。
结果:AC
import java.io.*;
import java.util.Scanner;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static Scanner sc = new Scanner(System.in);
static int[] a = new int[7];
static int res;
public static void main(String[] args) throws IOException {
while (sc.hasNext()) {
//b数组用来记录可以用来分配的包裹空间
int[] b = new int[4];
int sum=0;
for (int i = 1; i < 7; i++) {
a[i] = sc.nextInt();
sum+=a[i];
}
if(sum==0)break;
res = 0;
//6*6的产品必定独占一个包裹
res += a[6];
//5*5的产品必定要新开一个包裹来装,且会产生11个1*1的空间
res += a[5];
b[1] += a[5] * 11;
//4*4的产品必定要新开一个包裹来装,且会产生5个2*2的空间,尽可能记录大空间就记录大空间,
// 因为2*2的空间一定可以装下4个1*1的空间,但是4个1*1的空间却不一定能装下一个2*2的空间。
res += a[4];
b[2] += a[4] * 5;
//3*3的产品4个为一组,最后新开的包裹因其空间内还剩的3*3的产品的个数不同而产生不同个数的2*2的空间和1*1的空间
// 此公式可以通过枚举总结得到
res += (a[3] + 3) / 4;
a[3] %= 4;
if(a[3]!=0){
b[2]+=(7-a[3]*2);
b[1]+=(8-a[3]);
}
//2*2的产品和1*1的产品就慢慢处理即可
if (a[2] > b[2]) {
a[2] -= b[2];
res += (a[2] + 8) / 9;
b[1] += (36 - 4 * (a[2] % 9));
} else {
b[2] -= a[2];
b[1] += 4 * b[2];
}
if (a[1] > b[1]) {
a[1] -= b[1];
res += (a[1] + 35) / 36;
}
out.println(res);
out.flush();
}
}
}