您的位置:首页 > 其它

zzulioj 1899(985的最大和难题)

2016-08-09 09:26 387 查看
985的最大和难题

Time Limit: 1 Sec Memory Limit: 128 MB

Submit: 285 Solved: 29

SubmitStatusWeb Board

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

2

2

1 1 1

2

-10 20 -10

Sample Output

3

40

题解:通过认真仔细的观察(别人的代码),我发现了一个规律,就是当n 为奇数或者 负数的个数为偶数时 可以把所有数都变成偶数,否则就只需要减去一个绝对值最小的就好了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define M 10010
#define INF 0x3f3f3f

int abs(int a)
{
return a > 0 ? a : (-a);
}
int main()
{
int n, t, sum, mina, a;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
sum = 0;
mina = INF;
int k = 0;
for(int i=1; i<=2*n-1; i++)
{
scanf("%d", &a);
if(a >= 0)
{
sum += a;
}
else
{
k++;
sum -= a;
}
mina = min(mina, abs(a));
}
if(n & 1 || !(k & 1))//是奇数则全部都可以变成正的 ,或者 k 为偶数个时
{
printf("%d\n", sum);
}
else//是偶数并且 k 为 奇数时就有一个不能变成正的
{
printf("%d\n", sum-2 * mina);//减去两倍的最小值,因为之前加了
}

}

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