给定N 个加号、M 个减号以及N + M + 1 个整数A1,A2,…,AN+M+1
小明想知道在所有由这N 个加号、M 个减号以及N + M +1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用1 2 3 + -,则“2 3 + 1 -” 这个后缀表达式结果是4,是最大的。
输入
第一行包含两个整数N 和M。
第二行包含N + M + 1 个整数A1,A2,…,AN+M+1
0<=N,M<=100000,-10 ^ 9 <= Ai <= 10 ^ 9
输出
输出一个整数,代表答案。
样例输入
1 1
1 2 3
样例输出
4
详解见代码注释:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[200010];
int main()
{
//注意 后缀表达式是可以带括号的!!!!
ll n,m;
cin>>n>>m;
ll len=n+m+1;
ll f=0,sum=0;
for(int i=1;i<=len;i++)
{
cin>>a[i];
if(a[i]<0)
{
f++; //统计负数的个数
}
sum+=a[i];
}
sort(a+1,a+len+1);
if(m) //如果有负号
{
if(f) //如果有负数
{
if(f==len) //若全为负数 比如 n=3,m=3, -1 -2 -3 -4 -5 -6 -7,那么最大值必然是:-1-(-2+(-3)+(-4)+(-5))-(-6)-(-7)
{ //通过多次尝试可以发现,无论n,m为几,只要全是负数,那么最大值就是 最大的负数+其余所有负数的绝对值
for(int i=1;i<len;i++)
{
sum-=2*a[i];
}
}
else //若不全为负数 比如 n=3,m=3, 2 2 2 2 2 -1 -1,最大值的形式为 2+2+2+2-(-1-2)-(-1) 若n=1,m=5 最大值形式为 2+2-(-1-2-2-2)-(-1)
{ //通过多次尝试可以发现,无论n,m为几,只要不全为负数,那么最大值就是所有数的绝对值之和
for(int i=1;i<=f;i++)
{
sum-=2*a[i];
}
}
}
else //如果没有负数 比如 n=3,m=2, 1 2 3 4 5 6,那么最大值必然是 6+5+4+3-(1-2) 若n=1,m=4 最大值形式为 6+5-(1-2-3-4)
//通过多次尝试可以发现,无论n,m为几,只要全是正数,那么最大值就是 除a[1]外的所有数相加-a[1]
sum-=2*a[1];
}
cout<<sum<<endl;
}