专题一 Problem R

一、题目编号:

           Problem R

二、简单题意:

          一个工厂生产的产品高度都为h,大小为平方数,1*1,2*2,3*3,4*4,5*5,6*6,最后交给顾客的都是6*6的包裹,给出顾客需要的产品,怎样安排可以使包裹数量最少。 

三、解题思路形成过程

       利用贪心算法,通过局部最优以达到整体最优。这个题的贪心策略很简单,要使总包裹数量最少,就应该尽量让每个包裹都装满。考虑每种类型的产品,从大到小依次安排,6*6,5*5,4*4的产品每个都需要一个包裹,4个3*3可以放在一个包裹,再看2*2的,4*4和11个2*2的放在一起,3个3*3最多可以放5个2*2,2个3*3最多可以放3个2*2,3个3*3最多可以放1个2*2,多余的2*2只能再加包裹,其余空间都可以放1*1的。

四、感想

       这个题每个方面都要考虑到,写代码时忘了一个包裹放4个3*3产品的情况,导致代码错误,还有要注意包裹数量应该向上取整。

五、AC代码     

#include<iostream>
using namespace std;
int main()
{
    int a,b,c,d,e,f;
    while(cin>>a>>b>>c>>d>>e>>f)
    {
        int sum=0,w=0,r;//sum记录包裹数,w记录包裹中能放2*2产品的数量
        if(a+b+c+d+e+f==0)
            break;
        else
        {
            sum=d+e+f+(c+3)/4;
            if(c%4==1)//一个包裹只放一个3*3的产品
              w=5+d*5;
            else if(c%4==2)//2个
                w=3+d*5;//
                else if(c%4==3)//3个
                w=1+d*5;
                else
                    w=d*5;
            if(w<b)//2*2产品在当前包裹中放不开
                sum+=((b-w+8)/9);
            r=sum*36-b*4-c*9-d*16-e*25-f*36;
            if(r<a)//1*1产品在当前包裹中放不开
                sum+=((a-r+35)/36);
            cout<<sum<<endl;
        }
    }
    return 0;
}

你可能感兴趣的:(专题一 Problem R)