题意:每个包装都是6*6的,现在给出1*1 2*2 …… 6*6的商品有多少个,问最少用多少个包装可以装完这些商品。
解法:贪心一下即可。首先4 5 6三个尺寸的商品根本没得选,必须占一个,所以我们先把4 5 6算一算,有空的位置向下取2 和 1。
然后就是3,那么包装最多可以装4个3,那么把尺寸为3的算一算,可能会有多出装不满的,那么就会向下拿2,最后拿1.这里手写一下暴力。
然后就是2,1,就很明朗了。
我写这题。。。竟然有除以一个尺寸是v/i*i这种低级错误。。。然后就是有的地方没加括号,wa了两发。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10];
void myload45(int v, int key) {
for(int i = key; i >= 1; i--) {
int Max_load = v / (i * i);
v -= i * i * (Max_load > a[i] ? a[i] : Max_load);
a[i] -= Max_load;
if(a[i] < 0)
a[i] = 0;
}
}
int main() {
int ans, v;
bool flag;
while(1) {
flag = 1;
for(int i = 1; i <= 6; i++) {
scanf("%d", &a[i]);
if(a[i])
flag = 0;
}
if(flag)
break;
ans = a[6];
for(int i = 5; i >= 4; i--) {
for(int j = 0; j < a[i]; j++) {
ans++;
myload45(36 - i * i, 6 - i);
}
}
ans += a[3] / 4;
a[3] %= 4;
if(a[3])
ans++;
if(a[3] == 1) {
v = 27 - (a[2] > 5 ? 5 : a[2]) * 4;
a[2] -= 5;
if(a[2] < 0)
a[2] = 0;
a[1] -= v;
if(a[1] < 0)
a[1] = 0;
} else if(a[3] == 2) {
v = 18 - (a[2] > 3 ? 3 : a[2]) * 4;
a[2] -= 3;
if(a[2] < 0)
a[2] = 0;
a[1] -= v;
if(a[1] < 0)
a[1] = 0;
} else if(a[3] == 3) {
v = 9 - (a[2] > 1 ? 1 : a[2]) * 4;
a[2] -= 1;
if(a[2] < 0)
a[2] = 0;
a[1] -= v;
if(a[1] < 0)
a[1] = 0;
}
if(a[2]) {
ans += a[2] / 9;
a[2] %= 9;
if(a[2]) {
ans++;
v = 36 - 4 * a[2];
a[2] = 0;
a[1] -= v;
if(a[1] < 0)
a[1] = 0;
}
}
if(a[1]) {
ans += a[1] / 36;
a[1] %= 36;
if(a[1])
ans++;
a[1] = 0;
}
cout << ans << endl;
}
return 0;
}