题意:给出n个湖,每个湖之间的行走所耗的时间也给出。还有渔夫这次行钓的总时间,渔夫从第一个湖还是行钓,每个湖初始可以钓到的鱼数为fi,每次钓之后下次再钓到的鱼数为fi=fi-di,问渔夫最多能钓多少鱼,并且输出每个湖停留的时间。
思路:我们枚举渔夫最后停留的湖,这样我们就可以计算出渔夫花在钓鱼上的时间,再根据这个时间来每次寻找哪一个湖钓的鱼最多,最后即可得到答案。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int n, h, ti[26], fi[26], di[26], tmp[26], ans, ta[26], tf[26];
void getans(int re) {
int i;
if (re > ans) memcpy(ta, tmp, sizeof(ta));
else {
for (i = 0;i < n;i++) {
if (ta[i] > tmp[i]) return;
if (ta[i] < tmp[i]) break;
}
memcpy(ta, tmp, sizeof(ta));
}
ans = re;
}
void cal(int v) {
int re = h, i, j;
for (i = 0;i < v;i++) re -= ti[i];
if (re <= 0) return;
memcpy(tf, fi, sizeof(tf));
memset(tmp, 0, sizeof(tmp));
int mx, sum = 0;
for (re;re > 0;re--) {
mx = j = 0;
for (i = 0;i <= v;i++) {
if (tf[i] > mx) mx = tf[i], j = i;
}
sum += tf[j];
tmp[j]++, tf[j] -= di[j];
if (tf[j] < 0) tf[j] = 0;
}
if (sum >= ans) getans(sum);
}
int main() {
int i, j, f = 0;
while (~scanf("%d", &n), n) {
if (f) puts("");
f = 1;
scanf("%d", &h);
h *= 12;
memset(ta, 0, sizeof(ta));
for (i = 0;i < n;i++) scanf("%d", &fi[i]);
for (i = 0;i < n;i++) scanf("%d", &di[i]);
for (i = 0;i < n-1;i++) scanf("%d", &ti[i]);
ans = 0;
for (i = 0;i < n;i++) {
cal(i);
}
for (i = 0;i < n;i++) {
if (i) printf(", ");
printf("%d", ta[i]*5);
}
printf("\nNumber of fish expected: %d\n", ans);
}
}

本文探讨了一种算法,用于帮助渔夫在有限时间内最大化捕鱼量,通过优化行程和钓鱼策略,实现资源的高效利用。

1247

被折叠的 条评论
为什么被折叠?



