题解装箱问题
Posted kcn999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解装箱问题相关的知识,希望对你有一定的参考价值。
题目描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1,2*2,3*3,4*4,5*5,6*6。这些产品通常使用一个6*6*h的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入格式
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量。输入文件将以6个0组成的一行结尾。
输出格式
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
输入样例
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
输出样例
2
1
题解
容易想到的贪心思路:
(1)放3*3,4*4,5*5,6*6
(2)用1*1填充放5*5箱子的剩余空间
(3)先用2*2填充放4*4箱子的剩余空间,再用1*1填充放4*4箱子的剩余空间
(4)先用2*2填充放3*3箱子的剩余空间,再用1*1填充放3*3箱子的剩余空间
(5)把4个1*1看作1个2*2,最后多出来的1*1也看作1个2*2,这样就把所有的1*1转化成2*2
(6)放剩余的2*2
#include <iostream> using namespace std; int a, b, c, d, e, f; int ans; int main() { int tmp; while(cin >> a >> b >> c >> d >> e >> f && (a || b || c || d || e || f)) { ans = (c + 3) / 4 + d + e + f; a = max(0, a - e * 11); tmp = max(0, d * 5 - b); b = max(0, b - d * 5); a = max(0, a - tmp * 4); c %= 4; if(c) { tmp = max(0, (5 - (c - 1) * 2) - b); b = max(0, b - (5 - (c - 1) * 2)); a = max(0, a - tmp * 4); a = max(0, a - (7 - (c - 1) * 2)); } ans += ((a + 3) / 4 + b + 8) / 9; cout << ans << "\n"; } return 0;
根据上面我们可以看出,2*2只需要用来填充放4*4和3*3的箱子,那我们也可以先算出填充完后剩余的2*2还需要多少个箱子。此时我们先更新$ans$。
容易想到,其实1*1需要填充的数量也就是$ans \times 36$再减去其它大小产品所占的空间。我们最后再加上填充完后剩余的1*1还需要多少个箱子即可。
#include <iostream> using namespace std; const int t[4] = {0, 5, 3, 1}; int a, b, c, d, e, f; int ans; int main() { int tmp; while(cin >> a >> b >> c >> d >> e >> f && (a || b || c || d || e || f)) { ans = f + e + d + (c + 3) / 4; ans += (max(0, b - d * 5 - t[c % 4]) + 8) / 9; ans += (max(0, a - ans * 36 + b * 4 + c * 9 + d * 16 + e * 25 + f * 36) + 35) / 36; cout << ans << "\n"; } return 0; }
以上是关于题解装箱问题的主要内容,如果未能解决你的问题,请参考以下文章