题目大意:总共有6种包裹,1 * 1、2 * 2、3 * 3、4 * 4、 5* 5、6 * 6,给出6种包裹的个数,现在有若干个6 * 6 的箱子,问,最少需要多少个箱子可以将所有的包裹装好。
解题思路:一开始想成了用分治法去做,结果大部分数据可以过,一些特殊的就不行了,后来才发现这题是到贪心的题目,4、5、6规格的包裹一个包裹就要占一个箱子,剩下的空隙用2和1大小的包裹去填充,一定要先默认是2 * 2的, 如果放得下的话,因为如果后面可以放2 * 2 的位置太多了, 可以转换成4 个1 * 1的。然后就是比较特殊的3 * 3,3 * 3的4 个可以填满一个箱子,所以只要列举出剩余1,2,3的情况就可以了。
#include <stdio.h>
const int N = 7;
int sum[N], n;
const int one[] = {0, 7, 6, 5};
const int two[] = {0, 5, 3, 1};
int main() {
while (1) {
// Read;
int flag = 1;
n = 0;
for (int i = 1; i < N; i++) {
scanf("%d", &sum[i]);
if (sum[i])
flag = 0;
}
if (flag) break;
int total = sum[6] + sum[5] + sum[4] + (sum[3] + 3) / 4;
int numOne = sum[5] * 11 + one[sum[3] % 4];
int numTwo = sum[4] * 5 + two[sum[3] % 4];
if (numTwo < sum[2]) {
int cur = sum[2] - numTwo;
int tmp = (cur + 8) / 9;
total += tmp;
numOne += 4 * (9 * tmp - cur);
}
else
numOne += 4 * (numTwo - sum[2]);
if (numOne < sum[1])
total += (sum[1] - numOne + 35) / 36;
printf("%d\n", total);
}
return 0;
}