| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 79543 | sh25_huangse | 钓鱼 | C++ | 无测评数据 | 0 MS | 0 KB | 1849 | 2026-01-04 14:25:50 |
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { int n, h; cin >> n >> h; int total_time = h * 12; // 将小时转换为5分钟单位 int F[30] = {0}, d[30] = {0}, t[30] = {0}; for (int i = 1; i <= n; i++) cin >> F[i]; for (int i = 1; i <= n; i++) cin >> d[i]; for (int i = 1; i <= n-1; i++) cin >> t[i]; // t[i]是从i到i+1的时间 // dp[i][j] 表示在前i个池塘,花费j个单位时间,能钓到的最大鱼数 int dp[30][400] = {0}; // 初始化,除了dp[0][0],其他都设为-1表示不可达 memset(dp, -1, sizeof(dp)); dp[0][0] = 0; int ans = 0; // 计算到达每个池塘累计需要的移动时间 int move_cost[30] = {0}; for (int i = 2; i <= n; i++) { move_cost[i] = move_cost[i-1] + t[i-1]; } // 动态规划 for (int i = 1; i <= n; i++) { // 遍历前i个池塘 for (int j = 0; j <= total_time; j++) { // 遍历总时间 // 计算纯留在第i个池塘钓鱼的时间 for (int k = 0; k <= j - move_cost[i]; k++) { // k是在当前池塘钓鱼的时间 if (dp[i-1][j - k - (i==1 ? 0 : t[i-1])] != -1) { // 计算在池塘i钓k个单位时间能得到的鱼 int fish = 0; int f = F[i]; for (int x = 0; x < k; x++) { if (f <= 0) break; fish += f; f -= d[i]; if (f < 0) f = 0; } dp[i][j] = max(dp[i][j], dp[i-1][j - k - (i==1 ? 0 : t[i-1])] + fish); } } ans = max(ans, dp[i][j]); } } cout << ans << endl; return 0; }