题意:一共有1×1,2×2,一直到到6×6 六种箱子要放到6*6的大箱子里,给出了这六种箱子的数量,问最少要准备几个这样的大箱子,高度一致不考虑。
题解:先从最大的箱子开始计算,尺寸为6、5、4的都只能放一个且占据一个大箱子,所以总数一定包括这三种箱子的数量和,然后尺寸为4的优先让尺寸2填充,尺寸为5只能让尺寸1填充,所以尺寸1、2,提前减掉。开始考虑尺寸3,尺寸3最多放4个就占据了一个大箱子,所以根据尺寸3放完后剩余空位,优先放尺寸2然后放尺寸1。将尺寸3填充后如果尺寸2已经为负说明不够,让尺寸1替代尺寸2的位置被减掉,尺寸2清零,尺寸1同上,最后如果尺寸1和尺寸2都有剩余,优先2全部填充,然后1。。。
#include <stdio.h>
#include <string.h>
int main() {
while (1) {
int temp = 0, ans = 0, pac[6];
for (int i = 0; i < 6; i++) {
scanf("%d", &pac[i]);
temp += pac[i];
}
if (temp == 0)
break;
for (int i = 5; i >= 3; i--)
ans += pac[i];
pac[0] -= pac[4] * 11;
pac[1] -= pac[3] * 5;
ans += pac[2] / 4;
if (pac[2] % 4 != 0)
ans++;
if (pac[2] % 4 == 1) {//只放1个尺寸3,尺寸2可放5个,然后尺寸1可放7个,下面类似
pac[0] -= 7;
pac[1] -= 5;
}
else if (pac[2] % 4 == 2) {
pac[1] -= 3;
pac[0] -= 6;
}
else if (pac[2] % 4 == 3) {
pac[1] -= 1;
pac[0] -= 5;
}
if (pac[1] < 0) {//尺寸2已无
pac[0] += pac[1] * 4;
pac[1] = 0;
}
if (pac[0] < 0)
pac[0] = 0;
ans += (pac[0] + pac[1] * 4) / 36;//尺寸2和尺寸1可能有剩余
if ((pac[0] + pac[1] * 4) % 36)
ans++;
printf("%d\n", ans);
}
return 0;
}