利用两个指针,其中一个从前往后扫a数组,另一个从后往前扫b数组,用可能成为最大值的数来更新答案。
优化为o(n)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#include<cstdio>
#include<iostream>
using namespace std;
#define for(i,n) for(int i=1;i<=n;i++)
#define D "%d"
#define prf printf
#define scf scanf
int n;int max1=-999,m,s[1999],s2[1999];
int a[1999],b[1999],c[1999],d[1999];
int main()
{
scf(D D,&n,&m);
for(i,n)
scf(D,&a[i]);
for(i,n)
scf(D,&b[i]);
for(i,n)
{
scf(D,&c[i]);
s[i]=max(s[i-1],c[i]);
}
for(i,n)
{
scf(D,&d[i]);
s2[i]=max(s2[i-1],d[i]);
}
int t=n;
for(i,n)
{
while(a[i]+b[t]>m&&t>0)
t--;
if(t==0) break;
max1=max(max1,s[i]+s2[t]);
}
prf(D,max1);
}