hoj 1094 Packets //poj 1017 Packets
/*
贪心:
当为6*6时,只能用一个盒子装
当为5*5时,可以每一个多装11个1*1的盒子
当为4*4时,可以先装2*2的盒子,每一个4*4的可以装5个2*2,若2*2不够,则装1*1的
当为3*3时,每一个可以装4个3*3,若最后不足4个,先用2*2的装,空余的位置用1*1装
当为2*2时,每一个可以装9个2*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; //每4个3*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;
}