解题思路:
首先明白这道题为什么叫后缀表达式,是因为后缀表达式不再引用括号(其实是隐式的引用括号),比如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分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复