装箱问题 (贪心水题)
【题目描述】
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。
【题目链接】
http://noi.openjudge.cn/ch0406/19/
【算法】
由于需要装箱的产品总面积一定,则最优情况是箱子浪费面积最少。6,5,4,3所需包裹数是一定的,然后尽可能满足2,最后在考虑1。细节要注意下,同时码力太弱了。。。唉。。。
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 int ans; 4 int a[7],b[4]={0,5,3,1}; 5 int main() 6 { 7 while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])!=EOF) { 8 if(!a[1]&&!a[2]&&!a[3]&&!a[4]&&!a[5]&&!a[6]) break; 9 ans=a[6]+a[5]+a[4]+ceil(a[3]/4.0); 10 int for2=a[4]*5+b[a[3]%4]; 11 if(for2<a[2]) ans+=ceil((a[2]-for2)/9.0); //至此,2,3,4,5,6所需箱子数已经确定,故当前还能插入的1的个数可以考虑反面用总面积减去用于其它产品的面积 12 int for1=ans*36-36*a[6]-25*a[5]-16*a[4]-9*a[3]-4*a[2]; 13 if(for1<a[1]) ans+=ceil((a[1]-for1)/36.0); 14 printf("%d\n",ans); 15 } 16 return 0; 17 }