Description
985有2 * n - 1个整数,他每次可以将其中n个数变号,操作次数不限,问他可以得到的最大和。
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据占两行,第一行输入一个整数n,下面一行输入2*n-1个整数a[]。
注:1 <= t <= 32,1 <= n <= 1e3,-1e3 <= a[] <= 1e3。
Output
输出一个整数代表可以得到的最大和。
Sample Input
221 1 12-10 20 -10
Sample Output
340
这一题的题意,真是难到我了,我无奈去百度题解,看了好久才终于意识到了每次把“n”“个”数变号的意思。。。。。。。。
原谅我太菜,,,
看懂了题,就好写了;
很好证明,当为n为奇数时一定能全变为偶数。
而当n为偶数时,小于零的数的个数也为偶数,也能全变成偶数。
其他情况不能,所以把绝对值最小的负数去掉,从而满足上述情况。再减去减去的负值;
因为看了题解,我发现有的题解是错的。没有考虑最初的情况是否最大。
比如: 输入2, 三个数为1 1 -1 肯定选择不变,
输出为2;
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define LL long long
#define N 200005
#define mod 1000000007
int dp[N];
int main()
{
int t,n,nu,k,sum,minn,s;
scanf("%d",&t);
while(t--)
{
k=0,sum=0,minn=99999999,s=0;
scanf("%d",&n);
for(int i=0;i<2*n-1;i++)
{
scanf("%d",&nu);
if(nu<0) k++;
else s+=nu;
sum+=abs(nu);
minn=min(minn,abs(nu));
}
if(n&1||(n%2==0&&k%2==0))
printf("%d\n",sum);
else
printf("%d\n",max(s,sum-2*minn));
}
return 0;
}