uva 311 Packets(贪心)

题目连接:311 - Packets


题目大意:总共有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;
}


你可能感兴趣的:(uva 311 Packets(贪心))