311
这个一开始上来没思路,感觉是贪心,但不知道怎么贪,看了看接替报告理解了:
先把4,5,6这种单独占一个包需要的包求出来,3的话每4个算一个包,
然后再算2的,按2的填前面那些包中的空隙,2的填完后如果2的还有剩余再添加包的个数,
最后把前面所有包剩余的空隙都按1的填,如果不够再添加包的个数
//============================================================================ // Name : 311.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <cmath> #include <cstdio> using namespace std; int a[7]; int one[5] = {0, 7, 6, 5}, two[5] = {0, 5, 3, 1}; int t, ans, ans1, ans2; int main() { 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])) { ans = 0; ans = a[6]+a[5]+a[4]+ceil(a[3]/4.0); ans2 = a[4]*5 + two[a[3]%4]; ans1 = a[5]*11 + one[a[3]%4]; if(ans2 < a[2]){ t = a[2]-ans2; t = ceil(t/9.0); ans += t; ans1 += 4*(9*t-(a[2]-ans2)); } else{ ans1 += 4*(ans2 - a[2]); } if(a[1] > ans1) ans += ceil((a[1]-ans1)/36.0); printf("%d\n", ans); } return 0; }