【题意】
有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;
}