hoj 1094 Packets //poj 1017 Packets

 

/*

 

 

 

贪心:

 

    当为6*6时,只能用一个盒子装

 

    当为5*5时,可以每一个多装111*1的盒子

 

    当为4*4时,可以先装2*2的盒子,每一个4*4的可以装52*2,若2*2不够,则装1*1

 

    当为3*3时,每一个可以装43*3,若最后不足4个,先用2*2的装,空余的位置用1*1

 

    当为2*2时,每一个可以装92*2的,最后有剩余装1*1

 

    若最后还有1*1的,每36个可以装一盒,多的算多一盒

 

 

 

*/

 

#include <iostream>

 

#include <cstdio>

 

using namespace std;

 

#define X 7

 

int a[X];

 

int main()

 

{

 

    freopen("sum.in","r",stdin);

 

    freopen("sum.out","w",stdout);

 

    while(scanf("%d%d%d%d%d%d",a+1,a+2,a+3,a+4,a+5,a+6),a[1]||a[2]||a[3]||a[4]||a[5]||a[6])

 

    {

 

       /////////////6

 

       int ans = a[6];

 

 

 

       /////////////5

 

       int temp = a[5]*11;

 

       ans += a[5];

 

       a[1] = max(0,a[1]-temp);//只能用1*1的装

 

 

 

       ////////////////4

 

       ans += a[4];

 

       temp = a[4]*5;

 

       if(temp>a[2])        //先用2*2的装

 

       {

 

           a[1] = max(0,a[1]-(temp-a[2])*4);//不够的话,用1*1

 

           a[2] = 0;

 

       }

 

       else

 

           a[2] -= temp;     //足够的2*2就用2*2的装就行

 

 

 

       ///////////3

 

       ans += (a[3]+3)/4;       //43*3一盒

 

       a[3] = a[3]%4;

 

       if(a[3])             //有剩余

 

       {

 

           if(a[2]>7-2*a[3])//2*2的够装的话

 

           {

 

              a[2] -= 7-2*a[3];//注意到当a[3] = {1 2 3},对应的a[2] = {5 3 1},构造函数

 

              a[1] = max(0,a[1]-8+a[3]);//剩下的用1*1

 

           }

 

           else              //2*2不够装的话,全用1*1的装

 

           {

 

              a[1] = max(0,a[1]-(36-9*a[3]-4*a[2]));

 

              a[2] = 0;

 

           }

 

       }

 

 

 

       ////////////////2

 

       ans += (a[2]+8)/9;       //9个装一盒

 

       a[2] = a[2]%9;

 

       if(a[2])

 

           a[1] = max(0,a[1]-36+a[2]*4);//剩下的用1*1的装

 

 

 

       ////////////////1

 

       ans += (a[1]+35)/36;

 

       printf("%d\n",ans);

 

    }

 

 

 

    return 0;

 

}

 

posted @ 2012-04-07 21:09  yejinru  阅读(157)  评论(0编辑  收藏  举报