#include <stdio.h>
int main(void){
int N,a,b,c,d,e,f,x,y;//其中y,x分别为装了其它的中能装2*2和1*1和数量 ,N为总箱子数量
int u[4]={0,5,3,1};
while(1){
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)break;
N=f+e+d+(c+3)/4;
y=5*d+u[c%4];
if(b>y)N+=(b-y+8)/9;
x=36*N-36*f-25*e-16*d-9*c-4*b;
if(a>x)N+=(a-x+35)/36;
printf("%d\n",N);
}
return 0;
}
- 说几点要点:
- 首先这个包装问题是要节省打包的快递盒的总个数,所以统一用最大的的型号,然后再在里面装小的能装的型号,以此达到最节省
- 然后我们明白,6*6的装了后3*3可以装2*2,1*1的,前面的也是可以,但不可以再装3*3
- 所以明白这几点以后我们就需要明确大概思路,就是先把大的装了,然后再计算装了大的后还剩下的空余地方能装多少小的
- 最后比较空余地方装了小的后是否还有没装的小的,若是有就再加。
技巧
- 在装了3*3的后剩余地方还能装几个2*2,由于未装满的6*6在其箱子中转的3*3的数目不同对应可装2*2不同,所以我们就用一个数组u来表示3*3的产品数目分别是4的倍数,4的倍数+1/+2/+3时,为3*3的产品打开的新箱子中剩余的2*2的空位个数。
- 小技巧:(c+3)/4正好等于c除以4向上取整的结果,这样就不用用if等复杂来区分不同情况了。
- 总结2,当需要向上取整时,(总数+(n-1))/n。如100个人(总数),每辆车坐3人(n),需要34辆车,33辆还有一个人没车,所以要+1,通过向上取整即让所加的小于等于n也就是+(n-1)达到目的,让多余的也有。
- 当输入特定数结束循环时,先用while(1),表示一直循环,直到到特定数break打破循环,避免死循环。