https://www.acwing.com/problem/content/1249/
目录
给定 N个加号、M 个减号以及 N+M+1 个整数A1,A2,···,AN+M+1,小明想知道在所有由这 N 个加号、M 个减号以及 N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用 123+−,则 “23+1−” 这个后缀表达式结果是 4,是最大的。
输入格式
第一行包含两个整数 N 和 M。
第二行包含 N+M+1 个整数 A1,A2,⋅⋅⋅,AN+M+1。
输出格式
输出一个整数,代表答案。
数据范围
0≤N,M≤10^5,
−109≤Ai≤10^9。输入样例:
1 1 1 2 3
输出样例:
4
题解思路:
这道题,开始看的时候我的第一感觉是,先排序,然后用所有的 +号 先把最大的数加起来,然后用 -号 从最小的数开始减,但是这种策略算出来的值并不是最大的。正确思路:1,先判断m==0,如果m==0,把所有数相加即可。2,m!=0 用最大的数减去最小的数,剩下的数 可加可减,为保证最大值,把剩下的数的绝对值相加即可。 这样说,可能有些同学不太明白;比如说4个数 a,b,c,d; 3个 -号 ,写成a-(b-c-d)=a-b+c+d,也就是只需要1个 -号,剩下的 -号 可以转化为 +号。所以就只需要用最大的数 - 最小的数,剩下的 -号 转化为+号,+ 剩下数的绝对值。
AC代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long int a[200010];
int main()
{
int n,m;cin>>n>>m;
int lens=n+m+1;
for(int i=0;i<lens;i++)cin>>a[i];
sort(a,a+lens);//排序
long long int ans=a[lens-1]-a[0],sum=0; //sum用于m==0情况,ans用于m!=0,先用最大减去最小
for(int i=1;i<lens-1;i++)ans+=abs(a[i]);//除了最大和最小的其他值,直接加上绝对值
if(m==0){
for(int i=0;i<lens;i++)sum+=a[i];
cout<<sum<<endl;
}
else cout<<ans<<endl;
return 0;
}