题意:一个工厂制造的产品形状都是长方体,它们的高度都是 h,长和宽都相等,一共有六个型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. 这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
分析:贪心题,要使得包裹数量最少,肯定都使用最大的包裹6*6,那么4*4、5*5、6*6着几种产品至少占一个包裹,3*3每四个占一个包裹,所以至少应该准备ans=num(4*4)+num(5*5)+num(6*6)+num(3*3)/4(num(3,3)/4向上取整)个包裹。然后再插入2*2的包裹,再插入1*1的包裹。
代码:
#include <iostream>
using namespace std;
int main(){
int a[7];
while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6]){
if(a[1]+a[2]+a[3]+a[4]+a[5]+a[6]==0) break;
int ans;
int b1,b2;///b1表示剩余空间能装1*1物品的最大个数 b2表示剩余空间能装2*2物品的最大个数
if(a[3]%4==0){///分情况讨论
ans = a[3]/4+a[4]+a[5]+a[6];///表示最少需要的包裹
b1=a[4]*20+a[5]*11;
b2=a[4]*5;
}
else{
ans = 1+a[3]/4+a[4]+a[5]+a[6];
b2=(4-a[3]%4)*2-1+a[4]*5;
b1=(4-a[3]%4)*9+a[4]*20+a[5]*11;
}
if(a[2]<=b2){
b1=b1-a[2]*4;
if(a[1]>b1){
ans += (a[1]-b1)/36;
if((a[1]-b1)%36) ans += 1;///注意多出来的情况!
}
cout<<ans<<endl;
continue;
}
ans += (a[2]-b2)/9;
b1-=b2*4;
if((a[2]-b2)%9==0){
if(a[1]>b1){
ans += (a[1]-b1)/36;
if((a[1]-b1)%36) ans += 1;
}
cout<<ans<<endl;
continue;
}
else{
ans += 1;
int tmp = 9-(a[2]-b2)%9;
b1=b1+tmp*4;
if(a[1]>b1){
ans += (a[1]-b1)/36;
if((a[1]-b1)%36) ans += 1;
}
cout<<ans<<endl;
continue;
}
}
}