逆波兰表达式,遵循后序遍历
贪心思想,每次找到局部最优解,就可以找到全局最优解。
将求解的问题分解成若干个子问题,要求值最大,故希望减号最少:
当m为0时,故只有加号,值为所有数相加;当m>0时,最大值=b - (a - a0 - a1 … - ak)~b - a + a0 + a1 +…+ ak
减1位最小值,加1位最大值
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10,INF = 1e9 + 10;
int n,m;
LL a[N];
int main(){
scanf("%d%d",&n,&m);
int k = n + m + 1;
for(int i = 0;i < k;++i) scanf("%lld",&a[i]);
LL res = 0,maxn = -INF,minn = INF;
if(!m){
for(int i = 0;i < k;++i) res += a[i];
}else{
sort(a,a + k);
maxn = max(maxn,a[k - 1]);
minn = min(minn,a[0]);
res = maxn - minn;
for(int i = 1;i < k - 1;++i) res += abs(a[i]);
}
printf("%lld\n",res);
return 0;
}