2025.12.13 作业- # P1717 钓鱼
题目描述
话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999 决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼。
但是,因为还要准备 NOIP2013, z 老师只给了他 \(H\) 个小时的空余时间,假设有 \(n\) 个鱼塘都在一条水平路边,从左边到右编号为 \(1,2,3\dots n\) 。
VIP 是个很讲究效率的孩子,他希望用这些时间钓到尽量多的鱼。他从湖 \(1\) 出发,向右走,有选择的在一些湖边停留一定的时间钓鱼,最后在某一个湖边结束钓鱼。他测出从第 \(i\) 个湖到 \(i+1\) 个湖需要走 \(5 \times t_i\) 分钟的路,还测出在第 \(i\) 个湖边停留,第一个 \(5\) 分钟可以钓到鱼 \(f_i\),以后再每钓 \(5\) 分钟鱼,鱼量减少 \(d_i\)。为了简化问题,他假定没有其他人钓鱼,也不会有其他因素影响他钓到期望数量的鱼。请编程求出能钓最多鱼的数量。
输入格式
第一行:湖的数量 \(n\)。
第二行:时间 \(H\)(小时)。
第三行:\(n\) 个数,\(f_1,f_2,\dots,f_n\)。
第四行:\(n\) 个数,\(d_1,d_2,\dots,d_n\)。
第五行:\(n-1\) 个数,\(t_1,t_2,\dots,t_{n-1}\)
输出格式
一个数,所能钓鱼的最大数量。
输入输出样例 #1
输入 #1
2
1
10 1
2 5
2
输出 #1
31
说明/提示
数据范围:\(1\le H \le 16,2\le n \le 25,1\le f_i\le 200,0\le d_i\le 20,1\le t_i\le 20\)。
题解
思考1: 走路不需要时间,如果钓鱼。策略:每次都找鱼最多的地方。
思考2:走路需要时间,可以统计出每个湖的钓鱼次数,减少走路的时间代价。
思考3:在\(T\)时间内,如果钓到最多的鱼。固定钓鱼的区间,先扣除走路时间,用剩下时间就是走路不需要时间的钓鱼策略。
#include<bits/stdc++.h>
using namespace std;
int n,h,a[30],b[30],t[30],tmp[30],tans,ans;
int main()
{ cin>>n>>h;
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++) scanf("%d",&b[i]);
for (int i=1;i<n;i++) scanf("%d",&t[i+1]);
h=h*60/5;
for (int i=1;i<=n;i++){
h-=t[i]; tans=0;
for (int j=1;j<=i;j++) tmp[j]=a[j];
for (int j=1;j<=h;j++){
int maxx=1;
for (int k=2;k<=i;k++)
if (tmp[maxx]<tmp[k]) maxx=k;
tans+=tmp[maxx];
if (tmp[maxx]-b[maxx]>0) tmp[maxx]-=b[maxx];
else tmp[maxx]=0;
}
ans=max(ans,tans);
}
cout<<ans;
return 0;
}
浙公网安备 33010602011771号