#include <bits/stdc++.h>
using namespace std;
int n;
int a[110],b[110],spend[110];
typedef pair<int,int> PII;
#define x first
#define y second
priority_queue<PII> q; //大根堆,队头是最大的
int main()
{
cin >> n;
//a[]:钓鱼起始数量
for(int i = 1;i<=n;i++) cin >> a[i];
//b[]:钓鱼的减少量公差
for(int i = 1;i<=n;i++) cin >> b[i];
for(int i = 2;i<=n;i++)
{
cin >> spend[i];
//前缀和求第一个鱼塘到第i个鱼塘所需要时间
spend[i]+=spend[i-1];
}
int T;
cin >> T;
int ans = 0;
for(int i =1;i<=n;i++) //枚举鱼塘,求前1个,前2个,前3个,,,前n个鱼数量
{
int fish_time = T - spend[i];//钓鱼时间
for(int k = 1;k<=i;k++)
q.push({a[k],k});
int fish = 0; //表示最远到第i个鱼塘
while(q.size()&&fish_time>0)
{
PII t = q.top();
q.pop();
int id = t.y;
fish+=t.x;
fish_time--;
//更新下一分钟钓鱼的数量
t.x-=b[id];
if(t.x>0) q.push({t.x,id});
}
ans = max(ans,fish);
}
cout << ans <<endl;
return 0;
}
1.判断能不能横跳走 : 鱼的数量和钓的次数有关,路线一条走即可,横跳消耗时间
2.由题意可得 :每次选取最大值,使用 priority_queue;
q.push{a[k],k};//进队
q.top();取堆首元素
q.pop():堆顶元素出堆
//枚举前1次,前俩次,前三次--- 前n次的鱼最大数量,更新鱼最大数量
for(int i = 1;i<=n;i++)
{
while(q.size()&& fish_time>0)
{
PII t = t.top();
q.pop();
fish+= t.x;
int id = t.y;
fish_time --;
t.x-=b[id];
if(t.x>0) q.push({t.x,id});
}
}