Run Time: 0.050
Ranking (as of 2016-08-11): 187 out of 508
Language: C++
/* UVa 757 - Gone Fishing To build using Visual Studio 2012: cl -EHsc -O2 UVa_757_Gone_Fishing.cpp */ #include <cstdio> const int n_max = 25, h_max = 16, interval = 5, nr_intervals_max = h_max * 60 / interval; int fi[n_max], di[n_max], ti[n_max]; int caught[n_max][nr_intervals_max + 1]; // caught[i][j] is the number of fishes caught at the i-th lake with j intervals spent int from[n_max][nr_intervals_max + 1]; void print_intervals(int i, int j) { if (!i) printf("%d", j * interval); else { print_intervals(i - 1, from[i][j]); printf(", %d", (j - from[i][j]) * interval); } } int main() { bool printed = false; while (true) { int n; scanf("%d", &n); if (!n) break; if (printed) putchar('\n'); else printed = true; int h; scanf("%d", &h); int nr_intervals = h * 60 / interval; for (int i = 0; i < n; i++) scanf("%d", &fi[i]); for (int i = 0; i < n; i++) scanf("%d", &di[i]); for (int i = 0; i < n - 1; i++) scanf("%d", &ti[i]); for (int i = 0; i < n; i++) for (int j = 0; j < nr_intervals; j++) caught[i][j] = from[i][j] = 0; for (int j = 1, f = fi[0], c = f; j <= nr_intervals; j++) { caught[0][j] = c; if ((f -= di[0]) > 0) c += f; } int max_i = 0, max_j = nr_intervals; nr_intervals -= ti[0]; for (int i = 1; i < n && nr_intervals > 0; i++) { for (int j = 1; j <= nr_intervals; j++) { caught[i][j] = caught[i - 1][j], from[i][j] = j; for (int k = j - 1, f = fi[i], c = f; k >= 0; k--) { if (caught[i][j] < caught[i - 1][k] + c) caught[i][j] = caught[i - 1][k] + c, from[i][j] = k; if ((f -= di[i]) > 0) c += f; } } if (caught[max_i][max_j] < caught[i][nr_intervals]) max_i = i, max_j = nr_intervals; nr_intervals -= ti[i]; } #ifdef DEBUG for (int i = 0; i < n; i++) { for (int j = 0; j <= h * 60 / interval; j++) if (caught[i][j]) printf("[%d][%d]: (%d %d) ", i, j, caught[i][j], from[i][j]); putchar('\n'); } printf("%d %d\n", max_i, max_j); #endif print_intervals(max_i, max_j); for (int i = max_i; i < n - 1; i++) printf(", 0"); printf("\nNumber of fish expected: %d\n", caught[max_i][max_j]); } return 0; }
No comments:
Post a Comment