#include <stdio.h> #include <stdlib.h> //used for 'exit' in error statements #include <assert.h> #define MAX_LAKE 25 #define MAX_HOUR 16 #define MAX_MIN5 MAX_HOUR*12 #define INPUT "B.txt" int n, min5, F[MAX_LAKE], d[MAX_LAKE], t[MAX_LAKE]; FILE *ifp; int read_case(void) { int i; fscanf(ifp,"%d", &n); if (!n) { return 0; } assert(1 <= n && n <= MAX_LAKE); fscanf(ifp,"%d", &min5); min5 *= 12; assert(12 <= min5 && min5 <= MAX_MIN5); for (i = 0; i < n; i++) { fscanf(ifp,"%d", F+i); assert(F[i] >= 0); } for (i = 0; i < n; i++) { fscanf(ifp,"%d", d+i); assert(d[i] >= 0); } for (i = 0; i < n-1; i++) { fscanf(ifp,"%d", t+i); assert(t[i] > 0); } return 1; } void solve_case(void) { /* max number of fish we can get starting at lake i, with 5*j minutes used */ int fishes[MAX_LAKE][MAX_MIN5]; /* how long we fish at lake i */ int len[MAX_LAKE][MAX_MIN5]; int i, j, k, sum, dec, f, temp; /* fill base case */ sum = dec = 0; for (j = min5-1; j >= 0; j--) { if ((f = F[n-1] - dec) < 0) { f = 0; } sum += f; fishes[n-1][j] = sum; len[n-1][j] = min5-j; dec += d[n-1]; } /* compute table */ for (i = n-2; i >= 0; i--) { for (j = min5-1; j >= 0; j--) { sum = dec = 0; fishes[i][j] = -1; for (k = 0; k <= min5-j; k++) { if (j+k+t[i] < min5) { /* fish 5*k minutes, then move on */ temp = fishes[i+1][j+k+t[i]] + sum; } else { /* just stay here for the rest of time */ temp = sum; } if (temp >= fishes[i][j]) { fishes[i][j] = temp; len[i][j] = k; } if ((f = F[i] - dec) < 0) { f = 0; } sum += f; dec += d[i]; } } } /* now print the solution */ for (i = j = 0; i < n; i++) { if (i) { printf(", "); } if (j < min5) { printf("%d", len[i][j]*5); j += len[i][j] + t[i]; } else { printf("0"); } } printf("\n"); printf("Number of fish expected: %d\n", fishes[0][0]); } int main(void) { int first = 1; if ( (ifp=fopen(INPUT,"r")) == NULL) {printf("Cannot open %s file.\n",INPUT); exit;} while (read_case()) { if (!first) { printf("\n"); } solve_case(); first = 0; } return 0; }