按照题目,如果一条鱼都钓不到的话也要在第一个湖等到时间完。因为这个wa了好几次……
/* * Author: stormdpzh * POJ: 1042 Gone Fishing * Time: 2012/5/7 19:22:56 */ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <vector> #include <queue> #include <stack> #include <set> #include <algorithm> #include <functional> #define sz(v) ((int)(v).size()) #define rep(i, n) for(int i = 0; i < n; i++) #define repf(i, a, b) for(int i = a; i <= b; i++) #define out(n) printf("%d\n", n) #define wh(n) while(scanf("%d", &n) != EOF) #define whz(n) while(scanf("%d", &n) != EOF && n != 0) #define lint long long using namespace std; const int MaxN = 30; int f[MaxN], d[MaxN], t[MaxN]; int tmpf[MaxN], cost_t[MaxN], cost_t1[MaxN]; int fish; int n, h; void solve() { int total_time = h * 60 / 5; fish = 0; memset(cost_t1, 0, sizeof(cost_t1)); repf(i, 1, n) { memcpy(tmpf, f, sizeof(f)); memset(cost_t, 0, sizeof(cost_t)); int tmpt = h * 60 / 5; int sumf = 0; for(int j = 1; j < i; j++) tmpt -= t[j]; int tmp_total_time = tmpt; while(tmpt > 0) { bool flag = false; int maxf = 0, index; repf(j, 1, i) { if(tmpf[j] > maxf) { maxf = tmpf[j]; index = j; flag = true; } } if(flag) { cost_t[index] += 1; tmpf[index] -= d[index]; sumf += maxf; } tmpt -= 1; } if(sumf > fish) { fish = sumf; memcpy(cost_t1, cost_t, sizeof(cost_t)); total_time = tmp_total_time; } } int cost_time = 0; repf(i, 2, n) cost_time += cost_t1[i]; cost_t1[1] = total_time - cost_time; } int main() { //freopen("data.in", "r", stdin); whz(n) { scanf("%d", &h); repf(i, 1, n) scanf("%d", &f[i]); repf(i, 1, n) scanf("%d", &d[i]); repf(i, 1, n - 1) scanf("%d", &t[i]); solve(); repf(i, 1, n) { if(i == 1) printf("%d", cost_t1[i] * 5); else printf(", %d", cost_t1[i] * 5); } printf("\n"); printf("Number of fish expected: %d\n\n", fish); } return 0; }