用的纯模拟;;
听说有数学解法,稍候google一下:
#include <iostream> using namespace std; /*装有3*3 的箱子可放2*2的包数 当放1个3*3可以放5个2*2 2个可放3个2*2*/ int cc[4] = {0, 5, 3, 1}; int a, b, c, d, e, f; int num; int main() { while (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; /* 4*4,5*5,6*6 的无疑每个都需要一个盒子 */ num = d + e + f + (c+3)/4;/* (c+3)/4 是对于 3*3 的包需要的 6*6 大小的盒子数 */ int aa, bb; bb = 5*d + cc[c%4]; /* bb 是已有的包里能放多少个2*2的,每个放 4*4 的盒子还可以放 5 个 2*2的 */ if (b > bb) /* 如果可装2*2的个数小于2*2的总个数新开箱子 每1~9 个开一个新箱子 */ num += (b-bb+8)/9; aa = num*36 - f*36 - e*25 - d*16 - c*9 - b*4;/* 总共剩下可以装1*1箱子的个数 */ if (a>aa) /* 如果可装1*1的个数小于1*1的总个数新开箱子 每1~36开一个新箱子 */ num += (a-aa+35)/36; printf("%d\n", num); } return 0; }
# include <stdio.h>
# include <stdlib.h> # include <string.h> # include <string> int s[7]; int go () { int ans = s[6]; int t, t1, t2; ans += s[5]; t = s[1] / 11; if (t >= s[5]) { s[1] -= s[5] * 11; } else { s[1] = 0; } //printf ("the ans is %d\n", ans); t = s[2] / 5; ans += s[4]; if (t >= s[4]) { s[2] -= s[4] * 5; } else { t1 = s[4] - t; t2 = s[2] % 5; s[2] = 0; s[1] += t2 * 4; t = s[1] / 20; if (t >= t1) s[1] -= t1 * 20; else s[1] = 0; } //printf ("the ans is %d\n", ans); t = s[3] / 4; ans += t; t = s[3] % 4; if(t) { ++ ans; t = 4 - t; t1 = t * 2 - 1; if(s[2] >= t1) { s[2] -= t1; t2 = t * 9 - t1 * 4; if(s[1] >= t2) s[1] -= t2; else s[1] = 0; } else { s[1] += s[2] * 4; s[2] = 0; t1 = s[1] / (9 * t); if (t1) s[1] -= 9 * t; else s[1] = 0; } } //printf ("the ans is %d\n", ans); t = s[2] / 9; ans += t; s[1] += (s[2] - t * 9) * 4; t = s[1] / 36; ans += t; if (s[1] % 36) ++ ans; printf ("%d\n", ans); return ans; } int main () { while ((scanf("%d %d %d %d %d %d", &s[1], &s[2], &s[3], &s[4], &s[5], &s[6]), s[1] + s[2] + s[3] + s[4] + s[5] + s[6])) { go(); } return 0; }