题目描述
给定 N 个加号、M 个减号以及 N+M+1 个整数
A
1
,
A
2
,
⋅
⋅
⋅
,
A
N
+
M
+
1
A_1 ,A_2 ,⋅⋅⋅,A _{N+M+1}
A1,A2,⋅⋅⋅,AN+M+1 ,小明想知道在所有由这 N 个加号、M 个减号以及 N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用 1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。
输入描述
第一行包含两个整数 N,M。
第二行包含 N+M+1 个整数
A
1
,
A
2
,
⋅
⋅
⋅
,
A
N
+
M
+
1
A_1 ,A_2 ,⋅⋅⋅,A _{N+M+1}
A1,A2,⋅⋅⋅,AN+M+1 。
其中,
0
≤
N
,
M
≤
1
0
5
,
−
1
0
9
≤
A
i
≤
1
0
9
。
0≤N,M≤10^5 ,−10^9 ≤A_i ≤10^9 。
0≤N,M≤105,−109≤Ai≤109。
输出描述
输出一个整,代表答案。
输入输出样例
示例
输入
1
1 2 3
输出
4
运行限制
最大运行时间:1s
最大运行内存: 256M
分析+代码
/**
* 全为正数,则sum
* 全为负数
* 没有负号,sum
* 有负号,则所有绝对值的sum - 2* 最小绝对值/最大值
* 有正有负
* 则有一个负号就可以将所有负数变为正数
*/
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static final Scanner sc = new Scanner(System.in);
static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static final PrintWriter print = new PrintWriter(System.out);
static final StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static int nextInt() throws IOException {
st.nextToken();
return (int) st.nval;
}
public static long nextLong() throws IOException {
st.nextToken();
return (long) st.nval;
}
/**
* 全为正数,则sum
* 全为负数
* 没有负号,sum
* 有负号,则所有绝对值的sum - 2* 最小绝对值/最大值
* 有正有负
* 则有一个负号就可以将所有负数变为正数
*/
public static void main(String[] args) throws IOException {
int n = nextInt();
int m = nextInt();
int k = n + m + 1;
long[] a = new long[k];
for (int i = 0; i < k; i++) {
a[i] = nextLong();
}
Arrays.sort(a);
int zero = Arrays.binarySearch(a, 0);
if (zero < 0) {
zero = -zero - 1;
}
if (zero == 0) {
System.out.println(Arrays.stream(a).sum() - ((m >= 1) ? 2 * a[0] : 0));
} else {
if (m == 0) {
System.out.println(Arrays.stream(a).sum());
} else {
if (zero < a.length) {
System.out.println(Arrays.stream(a).map(Math::abs).sum());
} else {
System.out.println(Arrays.stream(a).map(Math::abs).sum() + 2 * Arrays.stream(a).max().getAsLong());
}
}
}
}
}