后缀表达式
题目链接-后缀表达式
解题思路
- 当只有加减符号时,后缀表达式相当于带括号的中缀表达式
- 当
m==0
时,我们只能将这些数相加,所以最大值即为 n + m + 1 n+m+1 n+m+1个整数的和 - 当
m!=0
,即至少有一个减号时:
- 当减号数目小于负数数目时,由于后缀表达式具有隐含的括号,相当于带括号的中缀表达式,所以只要有一个减号,既可以衍生出无数的减号, e g : a − ( b + c + … + z ) = a − b − c − … − z eg:a-(b+c+…+z)=a-b-c-…-z eg:a−(b+c+…+z)=a−b−c−…−z,(n=3,m=1 N个整数分别为4,-1,-2,-3,-4时,可以写成4-((-1)+(-2)+(-3)+(-4))=14)
- 当减号数目大于负数数目时,必定要减去一个数,所以我们减去一个最小的数就行了 e g 1 eg1 eg1:n=1,m=1,N个数分别为1,2,3,可以写成3+2-1=4, e g 2 eg2 eg2:n=0,m=2,N个数分别为1,2,3,可以写成3-(1-2)=3+2-1=4
- 当减号数目等于负数数目时,显然,直接全部都加上绝对值就行(n=2,m=2,N个整数分别为2,4,-3,-6,可以写成2+4-(-3)-(-6)=15)
- 综上,
m!=0
时,我们加上最大值,减去最小值,其他数都加上绝对值即可 - 具体操作见代码
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=2e5+5;
typedef long long ll;
typedef pair<int,int> PII;
int a[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m,ans=0;
cin>>n>>m;
int k=n+m+1;
for(int i=1;i<=k;i++)
cin>>a[i];
sort(a+1,a+k+1);
if(!m){
for(int i=1;i<=k;i++)
ans+=a[i];
cout<<ans<<endl;
}
else{
ans+=a[k];ans-=a[1];
for(int i=2;i<k;i++)
ans+=abs(a[i]);
cout<<ans<<endl;
}
return 0;
}