题目:1226:装箱问题
题目描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1×1, 2×2, 3×3, 4×4, 5×5, 6×6。这些产品通常使用一个6×6×h的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入
输入包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1×1至6×6这六种产品的数量。输入将以6个0组成的一行结尾。
输出
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
时空限制
1s / 64MB
样例输入
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
样例输出
2
1
代码
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=6+10;
int a[N],sum;
int main(){
while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6],a[1]||a[2]||a[3]||a[4]||a[5]||a[6]){
sum=a[6]+a[5]+a[4];
if(a[5]) a[1]=max(0,a[1]-11*a[5]);
if(a[2] && a[4]){
int x=a[2]/5;
int t=a[2];
a[2]=a[2]-min(a[4]*5,x*5+a[2]%5);
a[4]=a[4]*36-(a[4]*16+(t-a[2])*4);
}
if(a[1] && a[4]) a[1]=max(0,a[1]-a[4]);
sum+=a[3]/4;
a[3]%=4;
if(a[3]){
sum++;
if(a[2]){
switch(a[3]){
case 1:a[2]-=5;a[3]=a[3]*9+5*4;break;
case 2:a[2]-=3;a[3]=a[3]*9+3*4;break;
case 3:a[2]-=1;a[3]=a[3]*9+1*4;break;
}
}
a[2]=max(a[2],0);
if(a[1]) a[1]=max(0,a[1]-(36-a[3]));
}
sum+=a[2]/9;
a[2]%=9;
if(a[2]){
sum++;
if(a[1]) a[1]=max(0,a[1]-(36-a[2]*4));
}
sum+=a[1]/36;
a[1]%=36;
if(a[1]) sum++;
cout<<sum<<endl;
}
return 0;
}
结果
