归纳法
或理解为:只要有负号,最大值就是所有正数之和减去负数之和,而与负号数量无关;特别的,没有负数时整体和减去二倍的最小值。
法一
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e5+5;
#define efor(i,s,e) for(int i=s;i<=e;i++)
#define ffor(i,s,e) for(int i=s;i<e;i++)
#define out(x) cout<<x<<" "
#define nl cout<<endl
int n,m;
long long a[200010];
long long sum=0;
void init(){
cin>>n>>m;
int len=n+m+1;
ffor(i,0,len){
scanf("%lld", &a[i]);
sum+=a[i];
}
sort(a,a+len);
}
void acWing(){
init();
if(m==0){
cout<<sum<<endl;
return ;
}
long long ans=a[m+n]-a[0];
ffor(i,1,m+n){
ans+=abs(a[i]);
}
cout<<ans<<endl;
}
int main()
{
acWing();
return 0;
}
或者这样
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e5+5;
#define efor(i,s,e) for(int i=s;i<=e;i++)
#define ffor(i,s,e) for(int i=s;i<e;i++)
#define out(x) cout<<x<<" "
#define nl cout<<endl
int n,m;
long long a[200010];
long long sum=0;
void init(){
cin>>n>>m;
int len=n+m+1;
ffor(i,0,len){
scanf("%lld", &a[i]);
sum+=a[i];
}
sort(a,a+len);
}
void acWing(){
init();
if(m==0){
cout<<sum<<endl;
return ;
}
if(a[0]>0){
cout<<sum-2*a[0]<<endl;
return ;
}
long long ans=a[m+n];
ffor(i,0,m+n){
ans+=abs(a[i]);
}
cout<<ans<<endl;
}
int main()
{
acWing();
return 0;
}