POJ 1017 Packets
贪心,先放大的,大的可以附带上小的。
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; int a[10]; int main() { while(~scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])) { if(!a[1]&&!a[2]&&!a[3]&&!a[4]&&!a[5]&&!a[6]) break; int ans=0; if(a[6]) ans=ans+a[6]; if(a[5]) { ans=ans+a[5]; a[1]=a[1]-min(a[1],a[5]*11); } if(a[4]) { ans=ans+a[4]; if(a[2]<=a[4]*5) { a[1]=a[1]-min(a[1],4*(a[4]*5-a[2])); a[2]=0; } else a[2]=a[2]-a[4]*5; } if(a[3]) { ans=ans+a[3]/4; a[3]=a[3]%4; if(a[3]==1) { ans++; int u=min(5,a[2]); a[2]=a[2]-u; int v=min(a[1],7+4*(5-u)); a[1]=a[1]-v; } if(a[3]==2) { ans++; int u=min(3,a[2]); a[2]=a[2]-u; int v=min(a[1],6+4*(3-u)); a[1]=a[1]-v; } if(a[3]==3) { ans++; int u=min(1,a[2]); a[2]=a[2]-u; int v=min(a[1],5+4*(1-u)); a[1]=a[1]-v; } } if(a[2]) { ans=ans+a[2]/9; a[2]=a[2]%9; if(a[2]) { ans++; int v=min(a[1],4*(9-a[2])); a[1]=a[1]-v; } } if(a[1]) { ans=ans+a[1]/36; a[1]=a[1]%36; if(a[1]) ans++; } printf("%d\n",ans); } return 0; }