Central Europe 1996
Description
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
Input
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量。输入文件将以6个0组成的一行结尾。
Output
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
Sample Input
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
Sample Output
2
1
思路:
1.求6*6的产品所需要的箱子数;
2.求5*5+1*1所需要的箱子数;
3.求(4*4+2*2)+(4*4+1*1+1*1)所需要的箱子数;
4.求(3*3+3*3)+(3*3+2*2+1*1)+(3*3+1*1+1*1+1*1)所以需要的箱子数;
(以上四步所需要的箱子数较好求,可做合并)
5.求剩余产品所需要的箱子数,先装大的再装小的。
代码实现:
#include <bits/stdc++.h>
using namespace std;
int a[7],u[5]={0,5,3,1};//u[i]记录装入i个3*3的产品后可装入的2*2的产品的数量,通过画图找规律可得int main()
{
while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6])
{
int sum=0;
if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
break;
else
{
sum+=a[6]+a[5]+a[4]+ceil(a[3]/4.0);//完成前四步计算
int n2=5*a[4]+u[a[3]%4];//计算装4*4和3*3的箱子中剩下体积为2*2空间的数量
if(a[2]>n2)sum+=ceil((a[2]-n2)/9.0);//2*2需要单独放的箱子数量
int n1=36*(sum-a[6])-a[5]*25-a[4]*16-a[3]*9-a[2]*4;//计算前面箱子所剩1*1面积
if(a[1]>n1)sum+=ceil((a[1]-n1)/36.0);//1*1需要单独放的箱子数量
cout<<sum<<endl;
}
}
return 0;
}