POJ 1017 - Packets
2014-09-27 00:18
323 查看
题意很简单,有六种产品尺寸1*1, 2*2, 3*3, 4*4, 5*5, 6*6,要将产品装入6*6的箱子里(高度不需考虑,因为都一样)。给定各种尺寸的产品数量,求最少需要的箱子数。
除了分情况一步一步讨论,似乎没有什么便捷的做法。
6*6的最简单,一个产品一个箱子。
5*5的也很简单,也是一个产品一个箱子,最后剩余的空位用1*1来填。
4*4的就复杂些,也是一个产品一个箱子,最后每个箱子会刚好剩余5个可以容纳2*2的空间。这时如果2*2的数量足够,直接填满就行。但是假如不够,还得用1*1接着填。
3*3是最复杂的。首先每4个3*3可以填满一个箱子,如果还有剩,那么剩余的要单独作一个箱子。根据剩余量(1,2,3个),确定余下的空间能容纳多少个2*2及多少个1*1. 这个只能耐心去数了。
2*2的比较简单,每个箱子装9个,剩下单独一个箱子,并且用1*1填满。
最后1*1直接做除法就行了。
算法看起来不难,但是实现一点也不轻松,分支太多了,相当考验耐心和细心。
附上AC代码,写的并不漂亮,不过总体逻辑还算清晰:
除了分情况一步一步讨论,似乎没有什么便捷的做法。
6*6的最简单,一个产品一个箱子。
5*5的也很简单,也是一个产品一个箱子,最后剩余的空位用1*1来填。
4*4的就复杂些,也是一个产品一个箱子,最后每个箱子会刚好剩余5个可以容纳2*2的空间。这时如果2*2的数量足够,直接填满就行。但是假如不够,还得用1*1接着填。
3*3是最复杂的。首先每4个3*3可以填满一个箱子,如果还有剩,那么剩余的要单独作一个箱子。根据剩余量(1,2,3个),确定余下的空间能容纳多少个2*2及多少个1*1. 这个只能耐心去数了。
2*2的比较简单,每个箱子装9个,剩下单独一个箱子,并且用1*1填满。
最后1*1直接做除法就行了。
算法看起来不难,但是实现一点也不轻松,分支太多了,相当考验耐心和细心。
附上AC代码,写的并不漂亮,不过总体逻辑还算清晰:
#include <iostream> #define MAX(a, b) ((a) > (b) ? (a) : (b)) using namespace std; int main() { int n[7]; while (true) { int total = 0; for (int i = 1; i <= 6; i++) cin >> n[i]; if (n[1] + n[2] + n[3] + n[4] + n[5] + n[6] == 0) break; /* 6x6 */ total += n[6]; /* 5x5 */ total += n[5]; n[1] = MAX(n[1] - n[5] * 11, 0); /* 4x4 */ total += n[4]; if (n[2] < 5 * n[4]) { n[1] = MAX(n[1] - (5 * n[4] - n[2]) * 4, 0); n[2] = 0; } else { n[2] -= 5 * n[4]; } /* 3x3 */ total += n[3] / 4; int rest = n[3] % 4; if (rest == 1) { total++; if (n[2] < 5) { n[1] = MAX(n[1] - (5 - n[2]) * 4, 0); n[2] = 0; } else { n[2] -= 5; } n[1] = MAX(n[1] - 7, 0); } else if (rest == 2) { total++; if (n[2] < 3) { n[1] = MAX(n[1] - (3 - n[2]) * 4, 0); n[2] = 0; } else { n[2] -= 3; } n[1] = MAX(n[1] - 6, 0); } else if (rest == 3) { total++; if (n[2] == 0) { n[1] = MAX(n[1] - 9, 0); } else { n[2] -= 1; n[1] = MAX(n[1] - 5, 0); } } /* 2x2 */ if (n[2] > 0) { total += n[2] / 9; int rest = n[2] % 9; if (rest > 0) { total++; n[1] = MAX(n[1] - (36 - 4 * rest), 0); } } /* 1x1 */ if (n[1] > 0) { total += n[1] / 36; if (n[1] % 36 > 0)total++; } cout << total << endl; } return 0; }
相关文章推荐
- POJ 1017 Packets 悼念死去的模拟
- POJ 1017 Packets
- POJ 1017 Packets ----模拟
- POJ 1017 Packets【贪心】
- POJ 1017 Packets (贪心)
- poj--1017——Packets
- POJ 1017 Packets(模拟)
- POJ1017-Packets
- PKU POJ 1017 Packets 产品包装问题
- poj 1017 Packets
- poj 1017 Packets
- POJ1017 Packets
- POJ 1017 Packets(简单贪心)
- POJ 1017 Packets
- poj1017——Packets
- poj 1017 Packets(贪心)
- POJ 1017 - Packets(贪心+模拟)
- POJ -- 1017 Packets
- POJ 1017-Packets
- POJ 1017 Packets 贪心