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;

 

}

 

转载于:https://www.cnblogs.com/yejinru/archive/2012/04/07/2436495.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值