钓鱼(贪心、动态规划、优先队列)

原题链接

解题思路:先把时间分成以五分钟为单位时间,然后再枚举以那个池塘为终点,再用大根堆模拟过程,取最大值即可
C++代码
#include <bits/stdc++.h>
#define x first
#define y second
// #define int long long 
#define LL long long
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef pair<int, int> PII;
const int N = 110;
int t, w[N], n;
PII q[N];
signed main()
{
    IOS;
    cin >> n >> t;
    //一共有t段时间(五分钟为一段)
    t *= 12; 
    //数据读入
    for (int i = 1; i <= n; i ++ ) cin >> q[i].x;
    for (int i = 1; i <= n; i ++ ) cin >> q[i].y;
    for (int i = 1; i < n; i ++ ) cin >> w[i];
    int maxn = 0;
    
    //枚举以那个池塘为终点
    for (int i = 1; i <= n; i ++ )
    {
        priority_queue<PII> heap;
        int sum = 0;
        int tmp = t;
        for (int j = 1; j <= i; j ++ ) heap.push({q[j].x, q[j].y}); //将每个池塘的初始状态入队
        for (int j = 1; j < i; j ++ ) tmp -= w[j]; //减去走路的时间
        for (int j = 1; j <= tmp; j ++ ) //看tmp段时间最多能钓多少鱼
        {
            auto t = heap.top();
            heap.pop();
            if (t.x <= 0) break;
            sum += t.x;
            heap.push({t.x - t.y, t.y});
        }
        maxn = max(maxn, sum); 
    }
    cout << maxn << endl;
    return 0;
}

参考博客1
参考博客2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值