题意:一共有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;
}