题目描述
blablabla
解法
后缀表达式(隐式的使用括号),可以使用括号,并且括号与符号的位置可以随意摆放
因为括号的存在,所有的表达式最终一定会长成这样: a + b + c + d + c - (e - f - g - h - z) 或者 a + b + c + d - (e + f + g + h + z),加号减号之间可以相互转化,当然前提是有减号存在。
当缺少减号可以将加号放在括号中,负正得负, 反之, 负负得正。
分析所有可能性:
1.只有加号: 所有值相加就是结果.
2.只有减号: 该情况等同于情况3.
3.有加号也有减号:
3.1 只有正数:留下一个减号,别的减号转为加号,所以结果为所有的数的绝对值的和减去最小的一个正数就好了。
3.2 只有负数:留下一个加号,别的全部转化减号,所以结果为所有的数的绝对值的和减去最大的负数。
3.3 有正有负:进行加减法的转化,最终转换成减法的数量跟负数一样多,所以结果为所有的数的绝对值的和。
样例
blablabla
C++ 代码
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int MAXN=1e5+10;
int n,m,k;
LL a[2*MAXN];
//后缀表达式(隐式的使用括号),可以使用括号,括号与符号的位置可以随意摆放
//因为括号的存在,所有的表达式最终一定会长成这样: a + b + c + d + c - (e - f - g - h - z) 或者 a + b + c + d - (e + f + g + h + z)
//当缺少减号可以将加号放在括号中,负正得负, 反之, 负负得正
//分析所有可能性:
//1.只有加号: 所有值相加就是结果.
//2.只有减号: 该情况等同于情况 3.
//3.有加号也有减号:
////3.1 只有正数:留下一个减号,别的减号转为加号,所以结果为所有的数的绝对值的和减去最小的一个正数就好了。
////3.2 只有负数:留下一个加号,别的全部转化减号,所以结果为所有的数的绝对值的和减去最大的负数。
////3.3 有正有负:进行加减法的转化,最终转换成减法的数量跟负数一样多,所以结果为所有的数的绝对值的和。
int main(){
cin >> n >> m;
LL sum = 0,val = 0;
for(int i = 0; i < n + m + 1; i++) cin >> a[i],sum += abs(a[i]),val += a[i];
sort(a,a + n + m + 1,[](int t1,int t2) -> bool{return t1 > t2;});
if(m != 0){
if(a[n + m] >= 0) sum -= 2 * abs(a[n + m]);
if(a[0] < 0) sum -= 2 * abs(a[0]);
cout << sum << endl;
}
else
cout << val << endl;
return 0;
}