只能说很多重要的贪心思想我是……真的不知道啊,鬼知道去年S的T3我是怎么搞出来的。
这道题提供的思想就是如何解决这类有限制的朴素贪心。会发现这道题如果没有路上时间的限制就是一个贪心,把所有贡献丢进一个小根堆里每次选一个,减去变化值再丢进去即可。然而现在有了路上时间,我们要做的就是考虑如何预先处理掉这些路上花费的时间,于是想到了枚举,固定只能钓前i个池子的鱼然后减去路上时间之后就是朴素贪心了。
#include<bits/stdc++.h>
//#define zczc
const int N=110;
using namespace std;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
wh*=f;return;
}
inline int max(int s1,int s2){
return s1<s2?s2:s1;
}
int m,n,ans,an,a[N],b[N],t[N];
struct node{
int id,data;
};
inline bool operator <(node s1,node s2){
return s2.data>s1.data;
}
priority_queue<node>q;
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
read(m);read(n);n*=12;
for(int i=1;i<=m;i++)read(a[i]);
for(int i=1;i<=m;i++)read(b[i]);
for(int i=2;i<=m;i++)read(t[i]);
for(int i=1;i<=m;i++){
n-=t[i];an=0;
while(!q.empty())q.pop();
for(int j=1;j<=i;j++)q.push((node){j,a[j]});
for(int j=1;j<=n;j++){
if(q.empty())break;
node now=q.top();q.pop();
an+=now.data;now.data-=b[now.id];
if(now.data>0)q.push(now);
}
ans=max(ans,an);
}
printf("%d",ans);
return 0;
}