- 描述
- 一个工厂制造的产品形状都是长方体,它们的高度都是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
来源Central Europe 1996
示例代码:
#include <iostream>
using namespace std;
int main() {
int b6,b5,b4,b3,b2,b1; //不同大小的木块个数
int nTotal = 0; //最少需要的箱子数目
int c1; //当前能放 1*1 木块的空格数目
int c2; //当前能放 2*2 木块的空格数目
int Contain2[4] = { 0, 5, 3, 1 }; //Contain2[i] 表示当3*3木块的数目除以4的余数分别是0,1,2,3时,会产生多少个能放2*2木块的空格。
while(1){
cin>>b1>>b2>>b3>>b4>>b5>>b6;
if (b1 == 0 && b2 == 0 && b3 == 0 && b4 == 0
&& b5 == 0 && b6 == 0)
break;
nTotal = b6 + b5 + b4 + (b3 + 3)/4;
//这里有一个小技巧 - (b3+3)/4 正好等于b4除以4向上取整的结果,下同
c2 = 5 * b4 + Contain2[b3 % 4];
if(b2 > c2)
nTotal += (b2 - c2 + 8 ) / 9;
c1 = 36 * nTotal - 36 * b6 - 25 * b5 - 16 * b4 - 9 * b3 - 4 * b2;
if(b1 > c1)
nTotal += ( b1 - c1 + 35 ) / 36;
cout << nTotal << endl;
}
return 0;
}