【TOJ 1163】Gone Fishing【贪心+枚举】

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

题意:给出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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值