在一条水平路边,有n个钓鱼湖,从左到右编号为1,2,…,n。佳佳有H个小时的空余时间,他希望利用这个时间钓到更多的鱼。他从1出发,向右走,有选择的在一些湖边停留一定的时间(是5分钟的倍数)钓鱼。最后在某一个湖边结束钓鱼。佳佳从第i个湖到第i+1个湖需要走5\times T_i5×T
i
分钟路,还测出在第i个湖停留,第一个5分钟可以钓到F_iF
i
条鱼,以后每再钓5分钟,可以钓到的鱼量减少D_iD
i
,若减少后的鱼量小于0,则减少后的鱼量为0。为了简化问题,佳佳假定没有其他人钓鱼,也没有其他因素影响他钓到期望数量的鱼。请编程求出佳佳最多能钓鱼的数量。
思路:这道题思路感觉很妙,分别计算出只用1个鱼塘,2个鱼塘,3个鱼塘的最大值,取最大即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
int n,H;
int v[120];
int d[120];
int T[120];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
cin>>H;
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
for(int i=1;i<=n;i++)
{
cin>>d[i];
}
for(int i=2;i<=n;i++)
{
cin>>T[i];
}
int maxz=0;
H=H*60;
int time=0;
for(int i=1;i<=n;i++)
{
int k=H-time;
priority_queue<PII> p;
for(int j=1;j<=i;j++)
{
p.push(PII(v[j],j));
}
int temp=0;
while(k>=5&&!p.empty())
{
k-=5;
PII f=p.top();
p.pop();
int h=f.first;
int x=f.second;
temp+=h;
h-=d[x];
if(h>0)
{
p.push(PII(h,x));
}
}
//cout<<temp<<" "<<i<<endl;
maxz=max(maxz,temp);
time+=T[i+1]*5;
}
cout<<maxz<<endl;
return 0;
}