1、当n为奇数的时候,变换n个可以一次增加或减少1个负数,这样可以直到有n个负数,然后全变为整数ok
2、当n为偶数的时候,变换n个可以一次增加或减少2个负数,所以当有偶数个负数时都可以变为正数,当有奇数个负数时,最大和为(绝对值最小的那个为负数,其余的都为正数)。
用例子解释一下上面的内容。
n
为奇数n=5
,有序列-1,-1,-1,-1,-1,-1,-1,-1,-1
。可以发现,始终可以做到使得负数的个数小于n/2
。序列变为1,1,1,1,1,-1,-1,-1,-1
。然后选取n/2+1
个正数,n/2
个负数,就可以增加一个负数。上例就是是选择3
个1
和2
个-1
。序列变为1,1,1,1,-1,-1,-1,-1,-1
。然后一步变为全正。n
为偶数n
的划分,n只能划分为n/2-1
和n/2+1
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<map>
#include<istream>
#include<cassert>
#include<set>
#define DEBUG(x) cout<<#x<<" = "<<x<<endl
#define DEBUG2(x,y) cout<<#x<<" = "<<x<<" , "<<#y<<" = "<<y<<endl
using namespace std;
typedef long long ll;
const int MAXN=300;
int n;
int a[MAXN];
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int ii=0;ii<2*n-1 ;ii++ ){
scanf("%d",&a[ii]);
}
int ans=0;
if(n%2){
for(int ii=0;ii<2*n-1 ;ii++ ){
ans+=abs(a[ii]);
}
}
else {
int cnt=0;
int absmin=1e9;
for(int ii=0;ii<2*n-1 ;ii++ ){
if(a[ii]<0)cnt++;
absmin=min(absmin,abs(a[ii]));
ans+=abs(a[ii]);
}
if(cnt%2)ans-=2*absmin;
}
printf("%d\n",ans);
}
https://blog.csdn.net/xh_reventon/article/details/8892546
原文:https://www.cnblogs.com/MalcolmMeng/p/10945531.html