Packets POJ - 1017
考察:贪心
思路:
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 }