后缀表达式

简介: 后缀表达式

1、问题

给定N个加号、M个减号以及N+M+1个整数A1,A2,A3... ,AN+M+1,小明想知道在所有由这N个加号、M个减号以及N+M+1个整数凑出的合法的后缀表达式中,结果最大的是哪一个?请你输出这个最大的结果。
例如使用1 2 3 + -.则“2 3 + 1 -"这个后缀表达式结果是4,是最大的。


2、方法

首先,根据题目的要求可知,所有的计算都是按照运算符号出现的顺序,从左往右进行的,而后缀表达式是将运算符号放在两数之后,然后,可以先确定减号的数量,如果m=0,就是将所有数相加,如果m>0,需要分成三类来讨论,当数据全为负数时,就是加上最大的数,减去剩下的数字,当数据全为正数时,就是减去最小的数,加上剩余的数,当数据有正数也有负数时,最后的最大值就等于所有数的绝对值之和。


3、实验结果与讨论

通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

代码清单 1

n,m=map(int,input().split())
nums=list(map(int,input().split()))
nums.sort()
if m==0:
     result=sum(nums)
else:
     if nums[0]>0:
           result=sum(nums[1:len(nums)])-nums[0]
     elif nums[-1]<0:
           result=sum(nums[0:len(nums)-1])*(-1)+nums[-1]
     else:
           absnums=[abs(x) for x in nums]
           result=sum(absnums)
print(result)


4、结语

针对后缀表达式问题,提出先分析再分类讨论方法,通过实验,证明该方法是有效的,当然也会存在其他的解决方法,但是对于题目的解题思路,不仅能用于解决题目,更能在平常做事的解决思路。



目录
相关文章
|
4月前
|
存储 算法 C语言
C语言编程—中缀表达式转换为后缀表达式
1.创建栈 2.从左向右顺序获取中缀表达式 a.数字直接输出 b.运算符 情况一:遇到左括号直接入栈,遇到右括号将栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出。 情况二:遇到乘号和除号直接入栈,直到遇到优先级比它更低的运算符,依次弹栈。 情况三:遇到加号和减号,如果此时栈空,则直接入栈,否则,将栈中优先级高的运算符依次弹栈(注意:加号和减号属于同一个优先级,所以也依次弹栈)直到栈空或则遇到左括号为止,停止弹栈。(因为左括号要匹配右括号时才弹出)。 情况四:获取完后,将栈中剩余的运算符号依次弹栈输出 例:将:2*(9+6/3-5)+4转化为后缀表达式 2 9
40 0
|
8月前
【逆波兰表达式求值】
【逆波兰表达式求值】
|
7天前
彻底大悟!逆波兰表达式求值(150)
彻底大悟!逆波兰表达式求值(150)
|
9月前
中缀表达式转后缀表达式(逆波兰式)
中缀表达式转后缀表达式(逆波兰式)
|
10月前
1198:逆波兰表达式
1198:逆波兰表达式
|
5月前
逆波兰表达式求值
逆波兰表达式求值
35 1
|
10月前
|
算法
中缀表达式转后缀表达式(1、2、3) 2021-03-26
中缀表达式转后缀表达式(1、2、3) 2021-03-26
113 0
中缀表达式转后缀表达式(1、2、3) 2021-03-26
|
11月前
|
存储
中缀表达式转化为后缀表达式
中缀表达式转化为后缀表达式
|
12月前
7-323 逆波兰表达式
7-323 逆波兰表达式
39 0
|
12月前
leetcode150–逆波兰表达式求值(栈/后缀表达式)
leetcode150–逆波兰表达式求值(栈/后缀表达式)