【题目】后缀表达式
这里的所说的合法后缀表达式,是可以加括号的,举例子:
两个加号,一个减号。四个数:1、-1、-2、-3,这些变成后缀表达式就是
(-1)(-2)+(-3)+1-,写成人能看得懂的就是1-((-1)+(-2)+(-3))=7,然后我就开始琢磨可以加括号,那要怎么加括号才好。然后我就发现我们在正数加正数上加括号有意义吗?没意义,所以,我们就会发现其实后缀表达式值的大小取决于负数与减号的关系,虽然我又想到这里但是我分析的不全。然后看了大神的分析之后我醍醐灌顶,有道理。
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Scanner;
/**
* 后缀表达式
*
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
BigDecimal sum = new BigDecimal("0");
BigDecimal min = new BigDecimal("1000000000");
int[] nums = new int[a+b+1];
for (int i=0;i<a+b+1;i++) {
nums[i] = scanner.nextInt();
}
if(a==0&&b==0) {
System.out.println(nums[0]);
return;
}
Arrays.sort(nums);
int record=0;
for(int i=0;i<nums.length;i++) {
if(nums[i]<0) {
record++;
}else{
break;
}
}
if(b>record) { //减号多于负数
if(record==0) {
for(int i=0;i<a+b+1;i++) {
BigDecimal temp = new BigDecimal(nums[i]+"");
sum = sum.add(temp.abs());
min = temp.compareTo(min)==-1?temp.abs():min;
}
sum = sum.subtract(min.multiply(new BigDecimal("2")));
}else{
for(int i=0;i<a+b+1;i++) {
BigDecimal temp = new BigDecimal(nums[i]+"");
sum = sum.add(temp.abs());
}
}
}else if(b<record){
if(b==0) {
for(int i=0;i<a+b+1;i++) {
BigDecimal temp = new BigDecimal(nums[i]+"");
sum = sum.add(temp);
}
}else if (record==a+b+1){
for(int i=0;i<a+b+1;i++) {
BigDecimal temp = new BigDecimal(nums[i]+"");
sum = sum.add(temp.abs());
min = temp.compareTo(min)==-1?temp.abs():min;
}
sum = sum.subtract(min.multiply(new BigDecimal("2")));
}else{
for(int i=0;i<a+b+1;i++) {
BigDecimal temp = new BigDecimal(nums[i]+"");
sum = sum.add(temp.abs());
}
}
}else if(b==record) {
for(int i=0;i<a+b+1;i++) {
BigDecimal temp = new BigDecimal(nums[i]+"");
sum = sum.add(temp.abs());
}
}
System.out.println(sum);
}
}