1. 题目描述
题目链接:“蓝桥杯”练习系统
2.解题思路
题目给出N个加号,M个减号以及N+M+1个整数,要求求出由它们凑出的合法的后缀表达式中最大的结果。
实际上,就是求这N+M+1个数经过N次加法和M次减法运算得到的最大值。
可以分为以下几种情况:
N!=0,M=0:那么最大值就是将N+1个整数全部加在一起。
N!=0,M!=0:
① 整数中的最小值为正数,那么N+M+1个整数均为正数:
先将其中N+1个数加起来(这N个数不包括最小值),再用最小值去连续减去其余的数,最后用N+1个数的和减去M个数的差,即得到最大结果。
例:2个“+”,3个“-”,整数为1,2,3,4,5,6
最大结果 = 6 + 5 + 4 - (1 - 2 - 3)
= 6 + 5 + 4 - 1 + 2 + 3
= 6 + 5 + 4 + 3 + 2 - 1 = 19
规律:除最小值的其他数相加后 减去 最小值
② 整数中的最大值为负数,那么N+M+1个整数均为负数:
先将其中N+1个数加起来(这N个数不包括最大值),再用最大值去连续减去其余的数,最后用M个数的差减去N+1个数的和,即得到最大结果。
例:2个“+”,3个“-”,整数为-1,-2,-3,-4,-5,-6
最大结果 = [(-1) - (-2) - (-3)] - [(-6) + (-5) + (-4)]
= -1 + 2 + 3 + 6 + 5 + 4
= 19
规律: 除最大值的其他数取绝对值相加后 加上 最大值
③ 整数中既有负数又有正数
结合前两种情况,
例:2个“+”,3个“-”,整数为-1,-2,3,4,5,6
最大结果 = 6 + 5 + 4 - (-2) - [(-1) - 3]
= 6 + 5 + 4 + 2 +1 + 3
= 20
2个“+”,3个“-”,整数为-1,-2,-3,-4,5,6
最大结果 = 6 + 5 - (-4) - (-3) - [(-2)+(-1)]
= 6 + 5 + 4 + 3 + 2 + 1
= 20
规律: 所有整数的绝对值之和
N=0,M!=0: 情况与 N!=0,M!=0相同
例:5个“-”,整数为1,2,3,4,5,6
最大结果 = 2 - (1 - 3 - 4 - 5 - 6)
= -1 + 2 + 3 + 4 + 5 + 6
= 19
3.代码实现
N,M = map(int,input().split())
a = list(map(int,input().split()))
a.sort() # 从小到大排序
res = 0
if M==0: # 没有减号
res = sum(a)
else: # 有减号
if a[0]>0: # 最小值大于零,全为正数
res = sum(a[1:len(a)])-a[0]
elif a[-1]<0: # 最大值小于零,全为负数
res = abs(sum(a[0:len(a)-1]))+a[-1]
else: # 既有正数又有负数
absa = [abs(x) for x in a]
res = sum(absa)
print(res)