钓鱼

【题意】
有n个湖,从i到i+1花时间t[i]。再每个湖花费1个时间可以得分f[i],再花费一个时间得分f[i]-d[i],再花费一个f[i]-2d[i],以此类推。最后可以再任意一个湖结束。求给定总时间内得最大得分。

【题解】

时间范围不是很大,维护一个小根堆为当前所有的选择,从左向右枚举最终在哪个湖结束。由于越向右花在路上的时间越长,能用来钓鱼的时间越少,故每次右移动时弹出堆中的多余元素。每到一个新的湖,将这个湖里所有的选择加入小根堆,同时维护总个数即可。

#include <bits/stdc++.h>
using namespace std;

int n,h,f[105],d[105],t[105],tmp,ans;
priority_queue <int,vector<int>,greater<int> > q;

int main() {
    cin>>n>>h;
    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;i++) cin>>t[i];
    h*=12;
    for(int i=1;i<=n&&h>0;i++) {
        for(int j=1;j<=240&&f[i]>0;++j)
            q.push(f[i]), tmp+=f[i], f[i]-=d[i];
        while(q.size()>h) tmp-=q.top(), q.pop();
        ans=max(ans,tmp);
        h-=t[i];
    }
    cout<<ans<<endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值