后缀表达式 Python题解

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)

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值