后缀表达式
题目描述
给定 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,−109 ≤ Ai ≤109。)
输出
输出一个数,表示答案
样例输入
1 1
1 2 3
样例输出
4
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long a[200010];
int main()
{
int n,m;
scanf("%d %d",&n,&m);// n+ m-
int l=n+m+1;
for(int i=1; i<=l; i++)
scanf("%lld",&a[i]);
long long f=0,s=0;
for(int i=1; i<=l; i++)
{
if(a[i]<0)
f++;
s+=a[i];
}
sort(a+1,a+1+l);
if(m)
{
if(f)//如果有负数
{
if(f==l) //全是负数
{
for(int i=1; i<l; i++)
s-=2*a[i];
}
else//不全是负数
{
for(int i=1; i<=f; i++)
s-=2*a[i];
}
}
else//没有负数
{
s-=2*a[1];
}
}
printf("%lld\n",s);
return 0;
}