如果有偶数个负数,可以全部变为正数。假设负数为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