问题描述
时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分
【问题描述】
给定N个加号、M个减号以及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个整数A1,A2,··· ,AN+M+1 。
【输出格式】
输出一个整数,代表答案。
【样例输入】
1 1
1 2 3
【样例输出】
4
分析:
题目描述得相当抽象,其实题目和后缀表达式本身没啥关系,要想使得计算结果最大,就是尽可能将减号优先分配给负数,并且优先分配给较小的负数;如果减号有剩余则分配给较小的正数,这样就可以保证正数足够多且足够大,因此只需要对初始输入的一系列整数排序后按上述步骤完成即可。
代码实现:
import java.util.Arrays;
import java.util.Scanner;
public class DEMO {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[] A = new int[N + M + 1];
int temp = M;
int index = 0;
int sum = 0;
for (int i = 0; i < A.length; i++) {
A[i] = sc.nextInt();
}
/*Initial list*/
/*System.out.println(Arrays.toString(A));*/
Arrays.sort(A, 0, N + M + 1);
/*Sorted list*/
/*System.out.println(Arrays.toString(A));*/
for (int i = 0; i < M; i++) {
if (A[i] < 0) {
A[i] = -A[i];
temp--;
index++;
}
}
/*Minus signs cancel out negative numbers*/
/*System.out.println(Arrays.toString(A));*/
if (temp > 0) {
for (int i = index; temp > 0; i++, temp--) {
A[i] = -A[i];
}
}
/*Deal with the remaining minus sign*/
/*System.out.println(Arrays.toString(A));*/
for (int j : A) {
sum += j;
}
System.out.println(sum);
}
}