Description:
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有6个型号,它们的长宽分别为1×1,2×2,3×3,4×4,5×5,6×6。这些产品通常使用一个6×6×h的长方体包裹包装,然后邮寄给客户。因为邮费很贵,所以工厂要想方设法地减少每个订单运送时的包裹数量。他们很需要有一个好的程序以解决这个问题从而节省费用。现在这个程序由你来设计。
Input:
每个订单信息用包括6个整数的一行数据表示,中间用空格隔开,分别为1×1至6×6这6种产品的数量。
Output:
输出一个整数代表对应的订单所需的最小包裹数。
Sample Input:
0 0 4 0 0 1
Sample Output:
2
思路:
首先有个箱子装载图如下:
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
- 从大到小装入产品,尺寸4~6的各占一个箱子。
- 尺寸3要看具体情况,一个箱子最多4个尺寸3。
- 若尺寸3个数为
n
,则n/4表示被尺寸3完全转入的箱子,即箱子里面只有尺寸3。 - 若n%4>0则说明还有尺寸3剩余,需要再拿一个箱子装;则尺寸3一共需要
(n+3)/4
个箱子装,这个式子表示向上取整。 - 若n%4=1,则新箱子只有一个尺寸3,剩余空间能装5个尺寸2(见箱子装载图);同理n%4=2,剩余空间能装2个尺寸2;n%4=3,剩余空间能装1个尺寸2。
- 装入尺寸3完成后,计算所有箱子里还能装入多少尺寸2。
- 此时开始装尺寸2,如果尺寸2的数目大于尺寸2的空位,则需要为尺寸2开拓新的箱子。
- 转入尺寸2完成后,计算所有箱子里还能装入多少尺寸1。
- 此时开始装尺寸1,如果尺寸2的数目大于尺寸1的空位,则需要为尺寸1开拓新的箱子。
- 最终输出箱子个数。
代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main(){
int a[7]={0},sum=0; //尺寸1~6分别对应数组a[1]~a[6]
int two_size[4]={0,5,2,1}; //尺寸为3的产品,在不同情况下能装下的尺寸为2的个数
int two_empty,one_empty; //尺寸2和尺寸1的空位数目
for(int i=1;i<=6;i++)
cin>>a[i];
sum=a[6]+a[5]+a[4]+(a[3]+3)/4; //从大到小装,尺寸4~6的各占一个箱子,尺寸3要看具体情况
two_empty=a[4]*5+two_size[a[3]%4]; //尺寸4箱子剩余可装5个尺寸2,尺寸3剩余空位能装多少尺寸2要看具体情况
if(a[2]>two_empty) //当前尺寸2的产品大于剩余可装的空位,要装入新箱子
sum+=(a[2]-two_empty+8)/9; //一个新箱子最多装入9个尺寸2的产品
one_empty=sum*36-a[6]*36-a[5]*25-a[4]*16-a[3]*9-a[2]*2; //当前能装尺寸1的剩余空间
if(a[1]>one_empty) //对于尺寸1的产品,同理上面的if
sum+=(a[1]-one_empty+35)/36;
cout<<sum<<endl;
return 0;
}