1373:鱼塘钓鱼(fishing)
如果知道了取到最大值的情况下,人最后在第i个鱼塘里钓鱼,那么用在路上的时间是固定的,因为我们不会先跑到第i个鱼塘里钓一分钟后再返回前面的鱼塘钓鱼,这样把时间浪费在路上显然不划算。
其实并不是模拟钓鱼的过程,只是统计出在各个鱼塘钓鱼的次数。
只要确定了最大会经过的鱼塘(此时鱼塘间的移动耗时是固定的),就能通过堆实现在每个经过的鱼塘钓鱼的次数。
#include<iostream>
#include<cstdio>
#include<queue>
#define fish first
#define lake second
using namespace std;
priority_queue<pair<int,int>>heap;
const int N=105;
int t[N],f[N],d[N];
int maxx,t1;
void solve(){
ios::sync_with_stdio(false);//加快cin读取速度
cin.tie(0);
int m,n;
cin>>n;
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];
cin>>m;
for(int i=1;i<=n;i++){
int timee=m-t1,ans=0;
for(int j=1;j<=i;j++)heap.push(make_pair(f[j],j));
while(timee>0&&heap.top().fish>0){
pair<int,int>a=heap.top();
heap.pop();
ans+=a.fish;
a.fish-=d[a.lake];
heap.push(a);
timee--;
}
maxx=max(maxx,ans);
t1+=t[i];
}
cout<<maxx;
}
int main(){
solve();
return 0;
}