给定 N 个加号、M个减号以及 N+M+1 个整数 A1,A2,⋅⋅⋅,A(N+M+1),小明想知道在所有由这 N
个加号、M 个减号以及 N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用 123+−,则 “23+1−” 这个后缀表达式结果是 4,是最大的。
输入格式
第一行包含两个整数 N和 M。
第二行包含 N+M+1 个整数 A1,A2,⋅⋅⋅,A(N+M+1)。
输出格式
输出一个整数,代表答案。
数据范围
0≤N,M≤105,0≤N,M≤10^5,0≤N,M≤105,
−109≤Ai≤109−10^9≤Ai≤10^9−109≤Ai≤109
输入样例:
1 1
1 2 3
输出样例:
4
贪心策略
后缀表达式不再引用括号(其实是隐式的引用括号),比如2 3 + 1 - 这个式子,就是(2+3)−1=4, 从左向右计算,不考虑括号,运算符放在两个运算对象之后。
因为符号和数字的顺序可以随便安排,那么可以考虑下面几种情况:
因此得到下列讨论结果:
import java.util.Arrays;
import java.util.Scanner;public class Main {static Scanner sc = new Scanner(System.in);static int a[] = new int[200010];public static void main(String[] args) {int n = sc.nextInt();int m = sc.nextInt();int k = n + m + 1;for (int i = 1; i <= k; i++) a[i] = sc.nextInt();long res = 0;if (m == 0) {//没有减号for (int i = 1; i <= k; i++) res += a[i];} else {Arrays.sort(a, 1, k + 1);//从小到大排序res = a[k] - a[1];for (int i = 2; i <= k - 1; i++) res += Math.abs(a[i]);}System.out.println(res);return;}
}
上一篇:多线程之线程池详解