题目链接:https://www.lanqiao.cn/courses/2786/learning/?id=67814

Ideas

简单回顾一下前缀、中缀、后缀表达式
前缀表达式:前缀表达式的运算符位于操作数之前。
前缀表达式计算方法:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
前缀表达式举例:(- × + 3 4 5 6) = 29
中缀表达式:正常人类使用的算术表达方式
中缀表达式举例:((3 + 4) × 5 - 6) = 29
后缀表达式:后缀表达式与前缀表达式类似,只是运算符位于操作数之后。
后缀表达式计算方法:从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
后缀表达式举例:(3 4 + 5 × 6 -) = 29

这道题的意思是给我们几个数以及几个加减号,让我们怎么排列它们的位置可以让后缀表达式的值最大。

假设我们不考虑后缀表达式,就是正常的中缀表达式,那我们应该怎么组合呢?

首先对于题目给定的 N + M + 1 个数,先给它们排个序。

然后我们来分析一下负号的个数影响,举个例子:a1 < a2 < a3 < a4 < a5 < a6

  1. 一个"-"号:(a1 + a2 + a3) - (a4 + a5 + a6)
  2. 两个"-"号:(a1 + a2 + a3) - (a4 + a5) - a6
  3. 三个"-"号:(a1 + a2 + a3) - a4 - a5 - a6
  4. 四个"-"号:(a1 + a2) - (a4 - a3) - a5 - a6
  5. 五个"-"号:a1 - (a5 - a2) - (a4 - a3) - a6

我们可以发现一件神奇的事情,上面几个5个式子全部都是相等的,都等价于a1 + a2 + a3 - a4 - a5 - a6

所以说负号的数量 m ≥ 1 都能转换为 m = 1 的情况,那么我们其实就可以分情况讨论了,① m = 0,② m = 1。

此时,当 m ≥ 1 的时候,问题就转换成了,有 n + m + 1 个数字,我们的负号应该放在哪。

当 m = 0 时:相当于没有负号,所有的数字累加起来就OK了。

当 m ≥ 1 时,等价于 m = 1 时:

  1. 如果所有的数都是正数,那么 (a2 + a3 + a4 + a5 + a6) - (a1) 既是最大的结果
  2. 如果所有的数都是负数,那么 (a6) - (a1 + a2 + a3 + a4 + a5) 既是最大的结果,等价于 (abs(a1) + abs(a2) + abs(a3) + abs(a4) + abs(a5)) - abs(a6),跟第1种有点类似
  3. 如果有正有负,那么 (a1 + a2 + a3) - (a4 + a5 + a6),其中a1、a2、a3是正数,a4、a5、a6是负数,既是最大的结果,等价于 (a1 + a2 + a3) + abs(a4) + abs(a5) + abs(a6)

我们可以发现,对于a2到a5,只需要把它们的绝对值累加起来,而对于a1和a6我们再来单独看一下:

  1. 如果所有的数都是正数:最后的 a6 - a1 等价于 abs(a1 - a6)
  2. 如果所有的数都是负数,也是 abs(a1) - abs(a6),等价于 abs(a1 - a6)
  3. 如果有正有负:是 a1 + abs(a6),等价于 a1 - a6,肯定是正数,所以也可以加上绝对值号:abs(a1 - a6)

这样我们的结果就统一了。

Code

Python

if __name__ == '__main__':n, m = map(int, input().split())nums = list(map(int, input().split(' ')))if m == 0:print(sum(nums))else:ans = 0nums.sort()for i in range(1, n + m):ans += abs(nums[i])ans += abs(nums[0] - nums[-1])print(ans)

2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - I. 后缀表达式相关推荐

  1. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - B. 矩形切割

    题目链接:https://www.lanqiao.cn/courses/2786/learning/?id=67815 Ideas 对于一个矩形来说,能切割下来的正方形肯定是以较短的那条边为边长,然后 ...

  2. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - D. 质数

    Ideas 本来一开始想到的是质数筛,但是埃式筛是用来筛选 n 以内的所有质数,并不能找到第 n 个质数,除非找到一个足够大的 n 能够把第 2019 个质数包含进去. 可能质数筛还有升级,能够用来找 ...

  3. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - B. 年号字串

    [问题描述] 小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26. 对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对应 28,AZ 对应 ...

  4. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - D. 数的分解

    [问题描述] 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1 ...

  5. 2019年第十届蓝桥杯 - 省赛 - C/C++大学A组 - G. 日期问题

    题目 标题:日期问题 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月 ...

  6. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - C. 数列求值

    [问题描述] 给定数列 1, 1, 1, 3, 5, 9, 17, -,从第 4 项开始,每项都是前 3 项的和. 求第 20190324 项的最后 4 位数字. [答案提交] 这是一道结果填空的题, ...

  7. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - F. 旋转

    Ideas 有点类似于线性代数的矩阵转置,不过这个是顺时针转90°,转置相当于是逆时针转90°. 但其实原理是一样的,矩阵转置是第一行变为第一列,第二行变为第二列-- 顺时针转90°其实就是第一行变为 ...

  8. 2019年第十届蓝桥杯 - 省赛 - C/C++大学A组 - D. 迷宫

    maze.txt文件内容如下: 01010101001011001001010110010110100100001000101010 000010001000001010100100001000000 ...

  9. 2019年第十届蓝桥杯 - 省赛 - C/C++大学A组 - A. 平方和

    Ideas 迭代+Check. Code C++ #include <iostream> using namespace std;bool check(int num) {while (n ...

最新文章

  1. Java中的锁原理、锁优化、CAS、AQS详解!
  2. [机器学习] XGBoost on Spark 分布式使用完全手册
  3. 微信公众号文章中的音乐怎么设置自动播放
  4. linux内核驱动子系统,linux内核中的MFD子系统
  5. laravel5.3-数据库操作下的局部or条件与全局or条件(orWhere的局部与全局)
  6. 使用darknet批量测试图片并保存在指定文件夹下
  7. 设备接入ONENET(4)ONENET虚拟MQTT设备 simulate-device 使用
  8. 传统IT架构下面临的挑战?
  9. java tif 转jpg_java 实现 tif图片(多页的)转换成jpg
  10. php 数据透视表,无法打开数据透视表源文件怎么解决
  11. OAuth2.0+SpringSecurity+Jwt实现系统的登录认证,用户授权
  12. 【项目经验】产研流程(超级详细的步骤)
  13. android studio 自定义应用主题,Android studio 设置主题
  14. POJ 1463 入门树dp Strategic game
  15. 计算机or笔记本,笔记本or台式机 这几款戴尔主机性能上没得挑
  16. IP地址的获取—分析从连接WiFi到上网的全过程(二)
  17. AI学习知识点思维导图
  18. python画成绩正态分布图_正态分布为何如此重要?
  19. Matplotlib做动图(基础版)
  20. IgH详解十三、igh支持 hot connect

热门文章

  1. 杂项-QRCode:ZXing
  2. 闭包、执行环境、作用域链
  3. 其实昨天去加班也没有干什么事情,就只有3个人
  4. 在pl/sql中使用exp/imp工具实现oracle数据导出/导入
  5. Rose2003的安装和破解
  6. 【java】StringBuilder的常用两种方法与练习
  7. cdr 表格自动填充文字_「Excel技巧」Excel也可以实现自动填充26英文字母编号
  8. Magical Sticks 棍子拼接
  9. idea 启动php项目路径,关于idea中Java Web项目的访问路径问题
  10. 布局技巧3:创建高效布局