题目描述:
给定 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
思路:
我们设 输入的是A, b, c, d为例,大写表示正数,小写表示负数
count1 表示正数的数量
count2 表示负数的数量
max 表示负数最大的值
min 表示正数最小的值
S1 = abs( a ) + abs( b ) + abs( c ) + abs( d )
S2 = a + b + c + d
Ⅰ.M = 0时: S = S2;
Ⅱ.M != 0时:
1
1
1.M = count2 : S=S1
2
2
2.M < count2:
如果没有正数,即count1 = 0 那么 S = S1 + 2xmax,其它的情况 S = S1
3
3
3 .M > count2:
如果没有负数,那么 S = S1 - 2xmin,其它的情况 S = S1
代码:
#include <bits/stdc++.h>
using namespace std;
int N,M;
int main(){
cin>>N>>M;
int maxn=N+M+1;
int a[maxn];
for(int i=0;i<maxn;i++){
cin>>a[i];
}
sort(a,a+maxn);
int count1=0; //>0
int count2=0; //<0
for(int i=0;i<maxn;i++){
if(a[i]>=0){
break;
}
count2++;
}
count1=maxn-count2;
long long s1=0; //abs
long long s2=0; //normal
long long s3=0; //final
for(int i=0;i<maxn;i++){
s1+=abs(a[i]);
s2+=a[i];
}
if(M==0){
s3 = s2;
}else if(count2==M){
s3 = s1;
}else if(count2>M){
if(count1==0){
s3 = s1 + 2*a[count2-1];
}else{
s3 = s1;
}
}else{
if(count2==0){
s3 = s1 - 2*a[count2];
}else{
s3 = s1;
}
}
cout<<s3;
}