poj 1017

来源:互联网 发布:sql2000数据库备份 编辑:程序博客网 时间:2024/05/16 13:52

题目大意:

很久以前,有个6x6大小的盒子,和若干1x1、2x2、3x3、4x4、5x5、6x6大小的货物。

现在,我给你六个数字分别表示上述六种规格的货物的数量,请你帮我算一算至少要几个盒子能把他们全装下。输入六个0表示结束。


算法描述:

对于货物能装大的肯定先装大的!为什么呢?因为规格越小的货物越灵活呀!1x1的“见缝插针”,而4x4的就没那么灵活了。


对于6x6的货物,有多少个就要占据多少个盒子。


对于5x5的货物,有多少个就要占据多少个盒子。此外一个盒子装入1个5x5的货物后,还能装入11个1x1的货物,但不可能装入其他规格的货物了。所以尽可能多的让1x1的货物和5x5的货物装在一个盒子里。

黄色是1个5x5,灰色是11个1x1的空格,可以放入11个1x1的货物,而其他规格不行。


对于4x4的货物,有多少个就要占据多少个盒子。此外一个盒子装入1个4x4的货物后,还能装入5个2x2的货物或是20个1x1的货物,也可以让2x2和1x1的搭配起来装,比如装2个2x2的和12个1x1的。不过,要优先选择装2x2的。


对于3x3的货物,每凑够4个就可以刚好装满1个盒子,不足4个的,剩余的空格可以用来装2x2和1x1的。

如果,一个盒子里装了1个3x3的,那么该盒子还能装5个2x2的和7个1x1的。

黄色是1个3x3,绿色是7个1x1,蓝色是5个2x2。

如果,一个盒子里装了2个3x3的,那么该盒子还能装3个2x2的和6个1x1的。

如果,一个盒子里装了3个3x3的,那么该盒子还能装1个2x2的和5个1x1的。


最后,剩下2x2和1x1的货物了,先装2x2、后补1x1,很Easy的~!


a[0]......a[5] 表示六种规格货物的当前数量,box 表示需要的盒子数量(初始为0),block 表示某个盒子因没装满而空余的格子(初始为0)。

需要特别注意的地方是,每当把货物装入箱子后,不要忘记把该规格货物的当前数量减去。还要注意,尽管block空余的格子数多于货物的数量,但结构可能不允许放入某种规格的货物。


测试用例:

Input:0 0 4 0 0 17 5 1 0 0 036 9 4 1 1 10 9 4 1 1 00 0 4 0 0 036 0 0 0 0 00 9 0 0 0 079 96 94 30 18 1453 17 12 98 76 5483 44 47 42 80 315 26 13 29 42 4041 61 36 90 54 6678 56 445 45 23 6513 4 8 29 45 315 75 45 98 34 5340 9 0 2 0 041 9 0 2 0 044 0 0 0 4 00 2 3 0 0 037 7 2 0 1 012 2 0 1 0 013 2 0 1 0 00 0 0 0 0 0Output:216411186231137115219245791973442312


代码实现:

#include "iostream"using namespace std;int main(){    int a[6];    while((cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5])&&          (a[0]+a[1]+a[2]+a[3]+a[4]+a[5]))    {        int box=0,block=0;        box+=a[5];  //有几个6x6的货物,就添加几个箱子。        box+=a[4];  //5x5同上。        box+=a[3];  //4x4同上。        a[0]=max( 0, a[0]-a[4]*11 );    //此时此刻,1x1货物的数目=原有的数目-与5x5搭配的数目。        a[0]=max( 0, a[0]-max(0,a[3]*20-4*a[1]) );   //此时此刻,1x1货物的数目=原有的数目-与4x4搭配的数目(2x2货物搭配优先)。        a[1]=max( 0, a[1]-5*a[3] );    //此时此刻,2x2货物的数目=原有的数目-与4x4搭配的数目。        box+=a[2]/4;    //一个箱子装4件3x3的货物,又添加了这么多箱子。        if(a[2]%4==1)   //多余的,不足4件的3x3货物。        {            box++;            a[1]=max(0,a[1]-5);            a[0]=max(0,a[0]-7);        }        else if(a[2]%4==2)        {            box++;            a[1]=max(0,a[1]-3);            a[0]=max(0,a[0]-6);        }        else if(a[2]%4==3)        {            box++;            a[1]=max(0,a[1]-1);            a[0]=max(0,a[0]-5);        }        //此时此刻,只剩下2x2 1x1两种货物了。        box+=a[1]/9;    //一个箱子装9件2x2的货物,又添加了这么多箱子。        if(a[1]%9)      //多余的,不足9件的2x2货物,但还得用一个盒子装呀。        {            box++;            block=36-(4*(a[1]%9));    //剩余的空格,可以用来放1x1的货物。        }        a[0]=max(0,a[0]-block); //现在1x1货物的数目=原有的数目-放入上述空格的数目。        box+=a[0]/36;   //一个箱子装36件1x1的货物,又添加了这么多箱子。        if(a[0]%36)     //多余的,不足36件的1x1货物,但还得用一个盒子装呀。            box++;        cout<<box<<endl;    }    return 0;}


原创粉丝点击