给定一个长度为 n 的整数数组 a0,a1,…,an−1。
函数 sum(l,r)定义如下:
- 如果 l=r,则 sum(l,r)=0。
- 如果 l<r,则 sum(l,r)=。
请你找到一个整数三元组 (x,y,z),要求:
- 0≤x≤y≤z≤n
- sum(0,x)−sum(x,y)+sum(y,z)−sum(z,n) 的值尽可能大。
输出一个满足条件的整数三元组 (x,y,z)。
输入格式
第一行包含整数 n。
第二行包含 n 个整数 a0,a1,…,an−1。
输出格式
在一行内输出三个整数,表示满足条件的整数三元组 (x,y,z)。
如果答案不唯一,输出任意合理答案均可。
数据范围
前 44 个测试点满足 1≤n≤5。
所有测试点满足 1≤n≤5000,−10^9≤ai≤10^9。
输入样例1:
3
-1 2 3
输出样例1:
0 1 3
输入样例2:
4
0 0 -1 0
输出样例2:
0 0 0
输入样例3:
1
10000
输出样例3:
1 1 1
import java.util.*;
public class Main{
static long[] s;
public static void main(String args[]){
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
s=new long[n+1];
int rx=Integer.MIN_VALUE,ry=Integer.MIN_VALUE,rz=Integer.MIN_VALUE,z=n;
long max=Integer.MIN_VALUE;
for(int i=1;i<=n;i++) {
s[i]=s[i-1]+scan.nextInt();
}
for(int y=n;y>=0;y--) {
for(int x=0;x<=y;x++) {
if(getsum(y,n)<getsum(z,n)) {
z=y;
}
long t=s[n]-2*getsum(x,y)-2*getsum(z,n);
if(t>max) {
max=t;
rx=x;
ry=y;
rz=z;
}
}
}
System.out.printf(rx+" "+ry+" "+rz);
}
public static long getsum(int l,int r) {
return s[r]-s[l];
}
}