问题描述###
有6种产品,其高度均为h,底面积依次为:
1*1, 2*2, 3*3, 4*4, 5*5, 6*6
运送的盒子为6*6*h
最节省的放到话,需要多少个盒子
输入:
b1 b2 b3 b4 b5 b6为大小为1~6的产品的个数
难点###
只要思路清晰,没什么难点;
下面是Baseline的思路,没去想更加巧妙的解法~
尽量放相同大小的产品
首先,放入6*6,每个6*6耗费1个盒子;
然后,放入5*5,每个5*5耗费1个盒子,<b>每个盒子</b> 还剩余11个11的位置,用于放置11的产品;
然后,放入4*4,每个4*4耗费1个盒子,<b>每个盒子</b> 还剩余5个22的位置,用于放置22的产品;
然后,放入3*3,每4个3*3耗费1个盒子,如果还剩余5个2*2的位置,用于放置2*2的产品;
* 注意:
-- 如果 b3 % 4 == 1: 那么剩余空间可以放5个2*2 + 7个1*1
-- 如果 b3 % 4 == 2: 那么剩余空间可以放3个2*2 + 6个1*1
-- 如果 b3 % 4 == 1: 那么剩余空间可以放1个2*2 + 5个1*1
然后,放入2*2,每9个2*2耗费1个盒子,先使用以前剩余的位置来放置2*2,如果还没放完,那么再用新的盒子;如果放完了,把剩余的位置转化成放置1*1的产品的位置;
最后,放入1*1,每36个1*1耗费1个盒子,先使用以前剩余的位置来放置1*1,如果还没放完,那么再用新的盒子;
代码实现###
`
package poj;
import java.util.Scanner;
public class Poj1017 {
public static void main(String[] args) {
boolean flag = false;
Scanner sc = new Scanner(System.in);
String tmp = sc.nextLine();
String[] ss = tmp.split(" ");
int b1 = Integer.valueOf(ss[0]);
int b2 = Integer.valueOf(ss[1]);
int b3 = Integer.valueOf(ss[2]);
int b4 = Integer.valueOf(ss[3]);
int b5 = Integer.valueOf(ss[4]);
int b6 = Integer.valueOf(ss[5]);
while(b1+b2+b3+b4+b5+b6 != 0){
int cost = 0;
int c1 = 0;
int c2 = 0;
/* size: 66 /
cost += b6;
print(flag, cost, c2, c1);
/ size: 55 /
cost += b5;
/ 65 - 55 =
* 11 * 11
* /
c1 += 11 * b5;
print(flag, cost, c2, c1);
/ size: 44 /
cost += b4;
/ 66 - 44 =
* 5 * 44 or
* 20 * 11
* /
c2 += 5 * b4;
print(flag, cost, c2, c1);
/ size 33 /
if(b3 % 4 == 0){
cost += b3/4;
}else if(b3 % 4 == 1){
int u3 = b3/4 + 1;
cost += u3;
/ 66 - 33 =
* 5 * 22 + 7 * 11 or
* 27 * 11
/
c2 += 5;
c1 += 7;
}else if(b3 % 4 == 2){
int u3 = b3/4 + 1;
cost += u3;
/ 66 - 2 * 33 =
* 3 * 22 + 6 * 11 or
* 18 * 11
/
c2 += 3;
c1 += 6;
}else{
int u3 = b3/4 + 1;
cost += u3;
/ 66 - 3 * 33 =
* 1 * 22 + 5 * 11 or
* 9 * 11
/
c2 += 1;
c1 += 5;
}
print(flag, cost, c2, c1);
/ size: 22 /
if(b2 >= c2){
b2 = b2 - c2;
c2 = 0;
if(b2 % 9 == 0){
cost += b2/9;
}else{
cost += b2/9;
cost ++;
c1 += 4 * (9 - b2%9);
}
}else{
c2 = c2 - b2;
}
print(flag, cost, c2, c1);
/ size: 11 /
c1 += c2 * 4;
if(b1 >= c1){
b1 = b1 - c1;
c1 = 0;
if(b1%36 == 0){
cost += b1/36;
}else{
cost += b1/36;
cost ++;
}
}
print(flag, cost, c2, c1);
System.out.println(cost);
/ next case /
tmp = sc.nextLine();
ss = tmp.split(" ");
b1 = Integer.valueOf(ss[0]);
b2 = Integer.valueOf(ss[1]);
b3 = Integer.valueOf(ss[2]);
b4 = Integer.valueOf(ss[3]);
b5 = Integer.valueOf(ss[4]);
b6 = Integer.valueOf(ss[5]);
}
sc.close();
}
public static void print(boolean flag,int cost, int c2, int c1){
if(flag == true)
System.out.println(cost+" "+c2+" "+c1);
}
}
/
0 0 4 0 0 1
7 5 1 0 0 0
36 9 4 1 1 1
0 9 4 1 1 0
0 0 4 0 0 0
36 0 0 0 0 0
0 9 0 0 0 0
79 96 94 30 18 14
53 17 12 98 76 54
83 44 47 42 80 3
15 26 13 29 42 40
41 61 36 90 54 66
78 56 445 45 23 65
13 4 8 29 45 3
15 75 45 98 34 53
40 9 0 2 0 0
41 9 0 2 0 0
44 0 0 0 4 0
0 2 3 0 0 0
37 7 2 0 1 0
12 2 0 1 0 0
13 2 0 1 0 0
0 0 0 0 0 0
*/
`