贪心+优先队列
先枚举最后走到哪个湖,然后用优先队列跑一遍贪心即可
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct data{ int id,val;//id:在第id个湖;val:还能钓到的鱼的数量 bool operator < (const data &tmp) const{ return val<tmp.val; } }; //大根堆定义 int n,H,ans,t,f[102],a[102],d[102]; int main(){ scanf("%d%d",&n,&H); H*=12; //换算成以5分钟为单位时间 for(int i=1;i<=n;++i) scanf("%d",&f[i]); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=2;i<=n;++i) scanf("%d",&d[i]),d[i]+=d[i-1]; //直接计算前缀和 for(int i=1;i<=n;++i){ // priority_queue<data> h; t=0; for(int j=1;j<=i;++j) h.push((data){j,f[j]}); //加入第一次钓鱼的数据 for(int j=H-d[i];j>=1;--j){ //扣去路上的时间 data x=h.top(); h.pop(); if(!x.val) break; //只能取到0就跳出了 t+=x.val; h.push((data){x.id,x.val>a[x.id] ? x.val-a[x.id]:0}); //鱼量减少 } ans= ans>t ? ans:t; } printf("%d",ans); return 0; }