题目描述
在一条水平路边,有 nn 个钓鱼湖,从左到右编号为 1,2,…,n1,2,…,n。佳佳有 HH 个小时的空余时间,他希望利用这个时间钓到更多的鱼。他从 11 出发,向右走,有选择的在一些湖边停留一定的时间(是 55 分钟的倍数)钓鱼。最后在某一个湖边结束钓鱼。佳佳从第 ii 个湖到第 i+1i+1 个湖需要走 5\times T_i5×Ti 分钟路,还测出在第 ii 个湖停留,第一个 55 分钟可以钓到 F_iFi 条鱼,以后每再钓 55 分钟,可以钓到的鱼量减少 D_iDi,若减少后的鱼量小于 00,则减少后的鱼量为 00 。为了简化问题,佳佳假定没有其他人钓鱼,也没有其他因素影响他钓到期望数量的鱼。请编程求出佳佳最多能钓鱼的数量。
输入格式
第一行一个整数 nn,表示湖的个数
第二行一个整数 HH,表示佳佳的空闲时间
第三行有 nn 个整数,依次表示每个湖第一个 55 分钟能钓到鱼的数量
第四行有 nn 个整数,依次表示以后的每5分钟钓鱼数量比前一个 55 分钟钓鱼数量减少的数量
第五行有 n-1n−1 个整数,T_iTi 表示由第 ii 个湖到第 i+1i+1 个湖需要花 5\times T_i5×Ti 分钟的路程
输出格式
输出只有一行,表示佳佳最多能钓鱼的数量。
思路:从第一个开始,到最后一个。其中到每一个池塘的路程时间可以求出来,然后就是对于走到的几个池塘,剩余时间内能得到多少鱼的问题了。比如样例中走到第一个池塘还剩60分钟,那么就用着60分钟得到最多的鱼就可以了。
中间求最多鱼的的时候用到了优先队列。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+10;
const int mod=998244353;
int dx[]= {1,0,-1,0,1,1,-1,-1};
int dy[]= {0,1,0,-1,1,-1,1,-1};
int n,h;
int t[maxn];
struct Node
{
int x,y;
}a[maxn];
bool cmp(Node a,Node b)
{
return a.x>b.x;
}
bool cmp1(Node a,Node b)
{
return a.y>b.y;
}
void solve()
{
cin>>n>>h;
h*=60;
for(int i=1;i<=n;i++)
cin>>a[i].x;
for(int i=1;i<=n;i++)
cin>>a[i].y;
for(int i=2;i<=n;i++)
cin>>t[i];
t[1]=0;
int ans=0;
int sum=0;
priority_queue<pair<int ,int > > q;
for(int i=1;i<=n;i++)
{
while(!q.empty()) q.pop();
sum=0;
h-=t[i]*5;
int tim=h;
for(int j=1;j<=i;j++)
{
q.push(make_pair(a[j].x,a[j].y));
}
while(tim>0&&q.top().first>0)
{
pair<int ,int >s;
s=q.top();q.pop();
tim-=5;
sum+=s.first;
s.first-=s.second;
q.push(s);
}
ans=max(ans,sum);
}
cout<<ans<<endl;
}
int main()
{
solve();
}