题意:一个快递公司有1*1,2*2,3*3,4*4,5*5,6*6的6种同样高度的包裹,快递公司为了节约盒子,打算全用用6*6规模的盒子派送,多组输入,每次输入6种类型的包裹数量;求出打包所有包裹所需的6*6的盒子的最小数量。
思路:借鉴了网上大牛的思路。
1。每个6*6的盒子如果放入一个5*5的包裹就只能放11个1*1的包裹了。
2。如果放入一个4*4的包裹,可以放入5个2*2的包裹或只放入20个1*1的包裹,或者2*2的不足5个,就用4个1*1的代替1个空缺的2*2的包裹。
3.如果只放3*3的包裹就只放4个如果放不满就用2*2的补,如果2*2不够,再用1*1的补。
4.如果还剩下1*1的和2*2的包裹,就优先装2*2的,之后用1*1的补。直到全部装完。
下面上代码:
#include<cstdio>
#include<algorithm>
#include<set>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long LL;
int main()
{
int a[7];
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]))
{
int num=0;
num+=a[6];
num+=a[5];
a[1]-=a[5]*11<a[1]?a[5]*11:a[1];
num+=a[4];
int t=a[2];
a[2]-=a[4]*5<a[2]?a[4]*5:a[2];
if(!a[2]&&a[1]&&t!=a[4]*5)
a[1]-=(a[4]*5-t)*4<a[1]?(a[4]*5-t)*4:a[1];
if(a[3]%4==0)
{
num+=a[3]/4;
}
else
{
num+=a[3]/4+1;
int k=(7-a[3]%4*2)<a[2]?(7-a[3]%4*2):a[2];
a[2]-=k;
a[1]-=(36-a[3]%4*9-k*4)<a[1]?((36-a[3]%4*9)-k*4):a[1];
}
if(a[2]%9==0)
{
num+=a[2]/9;
}
else
{
num+=a[2]/9+1;
if(a[1]) a[1]-=(9-a[2]%9)*4<a[1]?(9-a[2]%9)*4:a[1];
}
if(a[1])
{
num+=a[1]%36==0?a[1]/36:a[1]/36+1;
}
printf("%d\n",num);
}
return 0;
}