John 有 h 小時(換算為 5 分鐘間隔數)去釣魚,n(≤25)個魚塘沿單向路排列。每塘初始產量 fᵢ,每 5 分鐘遞減 dᵢ。移動到下一塘需 tᵢ 個間隔。求最大期望捕魚數,並輸出各塘停留時間(若多解,優先在前塘多待)。
travel[i] = 從第 1 塘到第 i 塘的移動時間。#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, h, f[30], d[30], t[30], ans, rec[30], recA[30], tmp[30];
int findBest(int k) { // 在前 k 個塘找當前魚最多的
int best = 0, id = -1;
for (int i = 0; i <= k; ++i)
if (tmp[i] > best) { best = tmp[i]; id = i; }
return id;
}
int main() {
bool firstCase = true;
while (scanf("%d", &n) == 1 && n) {
if (!firstCase) puts(""); firstCase = false;
int H; scanf("%d", &H); h = H * 12;
for (int i = 0; i < n; ++i) scanf("%d", &f[i]);
for (int i = 0; i < n; ++i) scanf("%d", &d[i]);
t[0] = 0;
for (int i = 1; i < n; ++i) { scanf("%d", &t[i]); t[i] += t[i-1]; }
memset(recA, 0, sizeof(recA)); ans = 0;
for (int k = 0; k < n; ++k) {
int time = h - t[k]; if (time <= 0) break;
memcpy(tmp, f, sizeof(f));
memset(rec, 0, sizeof(rec));
int sum = 0;
while (time--) {
int id = findBest(k);
if (id == -1) break;
sum += tmp[id];
tmp[id] = max(0, tmp[id] - d[id]);
++rec[id];
}
if (time > 0) rec[0] += time; // 剩餘時間給第一塘
if (sum > ans) { ans = sum; memcpy(recA, rec, sizeof(rec)); }
}
printf("%d", recA[0] * 5);
for (int i = 1; i < n; ++i) printf(", %d", recA[i] * 5);
printf("\nNumber of fish expected: %d\n", ans);
}
return 0;
}