您的位置:首页 > 其它

zzuli 1899 985的最大和难题

2016-08-06 17:46 417 查看

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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: