题目大意:
有1*1,2*2,3*3,...六种小包裹,往6*6的箱子里装,给出六种小包裹各自的数量,求出最少用的箱子的个数。
贪心,思路还是比较简单的,先从大的开始往小的装。
6*6的包裹,每个单独装一个箱子;
5*5的包裹,可以和11个1*1的搭配;
4*4的包裹,可以喝5个2*2的搭配,如果2*2的不够,则补1*1的个数;
.
.
.
以此类推(注意3*3的有四种搭配方案)。
这里可以每次优先用2*2的去填,如果2*2的为负了,再用1*1的补正,这样可以简化过程。
最后如果1*1的数量为负,则不用处理(原因很简单,在此不赘余),若为正,则继续装。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
typedef long long ll;
#define inf 0x3f3f3f3f
using namespace std;
int a,b,c,d,e,f;
ll sum;
int main()
{
while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=EOF)
{
sum=0;
if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0) break;
sum=sum+f+e;
a=a-11*e;
sum=sum+d;
if(b-5*d>=0)
b=b-5*d;
else
{
a=a-4*(5*d-b);
b=0;
}
if(c%4==0)
sum=sum+c/4;
else if(c!=0)
{
sum=sum+c/4+1;
int te=c%4;
if(te==1)
{
if(b>=5)
{
b-=5;
a-=7;
}
else if(b==4)
{
b-=4;
a-=11;
}
else if(b==3)
{
b-=3;
a-=15;
}
else if(b==2)
{
b-=2;
a-=19;
}
else if(b==1)
{
b-=1;
a-=23;
}
else
{
a-=27;
}
}
else if(te==2)
{
if(b>=3)
{
b-=3;
a-=6;
}
else if(b==2)
{
b-=2;
a-=10;
}
else if(b==1)
{
b-=1;
a-=14;
}
else
{
a-=18;
}
}
else if(te==3)
{
if(b>=1)
{
b-=1;
a-=5;
}
else
{
a-=9;
}
}
}
if(b>0)
{
while(b>=9)
{
sum+=1;
b-=9;
}
if(b>0) sum+=1;
a=a-(9-(b%9))*4;
if(a>=0&&a%36==0)
sum+=a/36;
else if(a>0)
sum+=a/36+1;
}
else
{
if(a>=0&&a%36==0)
sum+=a/36;
else if(a>0)
sum+=a/36+1;
}
printf("%lld\n",sum);
}
return 0;
}