代码有些繁琐,写不出O(nlogn)的方法。
这道题的大意就是选择两段没有交叉的部分使得和最大。
我这里的a[]可以直接用前缀和next[]存储输入,没必要用a[];
可以用qzh[i] = next[i]- next[i-k]记录下每个K段的和;
然后用max[i]记录qzh[]前i项的最大值.
最后遍历数组,取出当前与max和最大的那一项即可.
import java.math.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;
public class Main {
public static void main(String args[])throws IOException
{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
int T = (int)in.nval;
for(int t=0;t<T;t++)
{
in.nextToken();
int n = (int)in.nval;
in.nextToken();
int k = (int)in.nval;
long a[] = new long[n];
long next[] = new long[n];
long qzh[] = new long[n];
long max[] = new long[n];
long sum=-1000000000;
for(int i=0;i<n;i++)
{
in.nextToken();
a[i] = (int)in.nval;
}
next[0] = a[0];
for(int i=1;i<n;i++)
{
next[i] = next[i-1]+a[i];
}
qzh[k-1] = next[k-1];
max[k-1] = qzh[k-1];
for(int i=k;i<n;i++)
{
qzh[i] = next[i]- next[i-k];
max[i] = Math.max(qzh[i],max[i-1]);
}
sum = qzh[2*k-1]+max[k-1];
for(int i=2*k;i<n;i++)
{
sum = Math.max(qzh[i]+max[i-k],sum);
}
out.println(sum);
}
out.flush();
}
}
京公网安备 11010502036488号