解题思路:
首先明白这道题为什么叫后缀表达式,是因为后缀表达式不再引用括号(其实是隐式的引用括号),比如2 3 + 1 - 这个式子,就是(2+3)−1=4
, 从左向右计算,不考虑括号,运算符放在两个运算对象之后。
因为符号和数字的顺序可以随便安排,那么可以考虑下面几种情况:
如果都是加号:那么直接将所有的数字全部加起来即可
如果有一个减号,那么我们可以转化为 …+…−(....+....+…)
的形式,即分为两部分,中间一个减号,因此只要出现一个减号那么就可以视为出现一个或多个减号等同的效果。
如果出现多个减号:也可以转化为…+…−(....+....−…)
的形式,也就是说你希望它是减号时你可以把它放到括号外,你希望它是加号时,你可以把它放在括号里边,因为负负得正,因此,一个减号与多个减号可以视作一种情况。
总结一下就是:只要m>0
, 那么减号的数量实际上就是1 到n+m
的任何一个数字。
因此得到下列讨论结果:
如果全是加号,答案就是所有数字直接相加。
如果存在减号:
如果全是正数,那么至少有一个被减去,所以把最小的那个减去即可。
如果有正有负,那么所有正数匹配正号,所有负数匹配负号,因此将它们的绝对值直接相加
如果全是负数,那么除了维持一个最大的负数(因为负数越大它的绝对值越小)为负数之后外,其他的全部翻正。
注意事项:无
参考代码:
from collections import deque n,m=map(int,input().split()) s=[int(i) for i in input().split()] s.sort() def solve(n,m): if m==0: return sum(s) if n==0: return s[1]-(s[0]-sum(s[2:])) ans=0 for i in s: ans+=abs(i) if s[0]>=0: return ans-2*s[0] if s[len(s)-1]<=0: return s[len(s)-1]+(ans-abs(s[len(s)-1])) return ans print(solve(n,m))
0.0分
9 人评分
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:567 |
C语言程序设计教程(第三版)课后习题12.2 (C语言代码)浏览:805 |
矩形面积交 (C语言代码)浏览:1511 |
震宇大神的杀毒软件 (C语言代码)浏览:1240 |
汽水瓶 (C语言代码)浏览:597 |
【蟠桃记】 (C语言代码)浏览:648 |
这可能是一个假的冒泡法浏览:985 |
最长单词 (C语言代码)浏览:1362 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:559 |
校门外的树 (C语言代码)浏览:956 |