本题是后缀表达式,可以通过增加括号的方式来改变结果的值
分情况讨论
1,M == 0,没有减号,那么只需要把所有的数相加即可
2,M > 0,也就是说至少有一个减号,我们先看只有一个减号的情况,
那么我们可以转化为 …+…−(....+....+…)的形式,
即分为两部分,中间一个减号,因此只要出现一个减号那么就可以视为出现一个或多个减号等同的效果。
如果出现多个减号:也可以转化为…+…−(....+....−…)的形式,
也就是说你希望它是减号时你可以把它放到括号外,你希望它是加号时,你可以把它放在括号里边,因为负负得正,因此,一个减号与多个减号可以视作一种情况。
因此减号其实可以是1 - M + N 个
所以,只需要找出最大值减去最小值,中间的数利用括号,把他们都相加就能得到最大值
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 200010;
int n,m;
typedef long long LL;
int a[N];
int main()
{
cin >> n >> m;
int k = m + n + 1;
for(int i = 0;i < k;i++) cin >> a[i];
sort(a,a+k);
LL res = 0;
if(m == 0)
{
for(int i = 0;i < k;i++) res += a[i];
}
else
{
res = a[k - 1] - a[0];
for(int i = 1;i < k - 1;i++)
{
res += abs(a[i]);
}
}
cout << res << endl;
return 0;
}