原题链接

考察:贪心

思路:

        6*6的箱子可以放下1个6*6、5*5、4*4,再用a[2]与a[1]填补空缺.

        3*3需要分情况讨论,一个6*6可以放下4个3*3,剩下的可以用a[3]、a[2]、a[1]补.

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 const int N = 7;
 7 int a[N],b[N] = {0,7,6,5},c[N] = {0,5,3,1};
 8 int main()
 9 {
10     while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])!=EOF)
11     {
12         if(!(a[1]|a[2]|a[3]|a[4]|a[5]|a[6])) break;
13         int ans = a[6];
14         ans += a[5],a[1]-=11*a[5];
15         ans += a[4];
16         if(a[2]>=5*a[4]) a[2]-=5*a[4];
17         else  a[1]-=(5*a[4]-a[2])*4,a[2] = 0;
18         ans += (a[3]+3)/4;
19         if(a[2]<c[a[3]%4]) a[1]-=(c[a[3]%4]-a[2])*4;
20         a[2] -= c[a[3]%4],a[1] -=b[a[3]%4];
21         if(a[2]>0) ans+=(a[2]+8)/9;
22         if(a[2]%9>0) a[1] -= (9-a[2]%9)*4;
23         if(a[1]>0) ans+=a[1]/36;
24         if(a[1]%36>0) ans++;
25         printf("%d\n",ans); 
26     }
27     return 0;
28 }