1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<queue>
5 #include<vector>
6 using namespace std;
7 const int maxn=1e6+7;
8 priority_queue<int> T;
9 int N,H,t[maxn],f[maxn],d[maxn],Ans;
10 int main(void)
11 {
12 scanf("%d%d",&N,&H);
13 H*=60;
14 for(int i=1; i<=N; ++i)scanf("%d",&f[i]);
15 for(int i=1; i<=N; ++i)scanf("%d",&d[i]);
16 for(int i=2; i<=N; ++i)scanf("%d",&t[i]);
17 for(int i=1; i<=N; ++i)
18 {
19 H-=(5*t[i]);//到第i个池塘所剩时间
20 if(H<0)break;//如果H<0,说明到不了第i个池塘,可以退出
21 int n=H/5,ans=0;
22 while(n--&&f[i]>0)
23 {
24 T.push(f[i]) ;
25 f[i]-=d[i];
26 }
27 n=H/5;
28 priority_queue<int> Q;//用大根堆,精简代码
29 Q=T;
30 while(n--&&!Q.empty() )//注意可钓鱼的次数与 所能钓出的鱼的种数都是有限的
31 {
32 ans+=Q.top() ;
33 Q.pop() ;
34 }
35 Ans=max(ans,Ans);//比较最远到达第i池塘时,所能钓到的最多的鱼
36 }
37 printf("%d",Ans);
38 return 0;
39 }