P1717 钓鱼
贪心+堆的方法其他题解已经讲的很清楚了,这里放出萌新简洁的dp做法,如果有正确性问题希望大佬能够指出qwq
#include<cstdio>
using namespace std;
#define max(a,b) (a>b ? a:b)
int n,m,ans,f[101][1001],a[101],b[101],t[101];
int main() {
scanf("%d%d",&n,&m);
m*=12; //有(m*60/5)个五分钟
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=2; i<=n; i++) scanf("%d",&t[i]); //t[i]:从i-1到i的路程时间
//f[i][j]是走到第i个湖,时间为j的最多钓鱼数
for (int i=1,tmp=t[1]; i<=n; tmp+=t[i+1],i++) //tmp是从1到i的路程总用时
for (int j=tmp; j<=m; j++){ //枚举到湖i的用时(至少是走到i的时间tmp)
for (int k=0; k<=j-tmp; k++) //在i钓鱼的时间
f[i][j]=max(f[i][j],f[i-1][j-t[i]-k]+max(0,k*a[i]-k*(k-1)/2*b[i]));
//钓鱼数为a[i]*k-(1+2+3+...+(k-1))*b[i]
ans=max(ans,f[i][j]);//更新答案
}
printf("%d",ans);
}