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;
}