如果有偶数个负数,可以全部变为正数。假设负数为k个,可以取k/2个负数与n−k/2个正数变一次。下一次取另k/2个与相同的正数再变,正数就没有发生改变,而负数都变为正数了。
如果有奇数个负数,就一定会剩下一个负数。把所有数中绝对值最小的那个变为负数就行了。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+10;
int n;
ll a[maxn];
int main() {
std::ios::sync_with_stdio(false);
cin>>n;
int cnt=0;
for(int i=1;i<=n*2-1;++i){
cin>>a[i];
if(a[i]<0){
cnt++;
}
}
sort(a+1,a+n*2,[&](int x,int y){
return abs(x)<abs(y);
});
ll ans=0;
if(cnt&1){// 奇数个有1个负数
for(int i=2;i<=2*n-1;++i){
ans+=abs(a[i]);
}
ans+=a[1];
}else{// 偶数个全可以变为正数
for(int i=1;i<=2*n-1;++i){
ans+=abs(a[i]);
}
}
cout<<ans;
return 0;
}
小红有一个长度为2×n−1的数组,每次可以选择其中n个数,将这n个数取反,小红想知道经过若干次操作之后,所有数字元素之和的最大是多少。
第一行一个整数n,数组长度为2×n−1。
第二行2×n−1个整数,表示数组元素。
1≤n≤105
−109≤ai≤109
输出一个整数,表示所有数组元素之和的最大值。
输入
3
-1 -2 3 -4 -5
输出
15
说明
先选择前三个元素取反,再选择后三个元素取反,数组元素之和最大为15