1899: 985的最大和难题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 328 Solved: 40
Submit Status Web 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
HINT
Source
这个思想靠我自己想我是想不出来,看了一下别人的题解,经过思考后总结了个容易理解的思路:
一个奇数可以把任意奇数或偶数个负数全部转换成正数,可以得到0个负数,奇得奇,奇得偶;
而由一个偶数,可以转换任意偶数个负数为正数,却不能转换奇数个负数为正数(因为始终有一个数是转换不过来的,正负转换的数的个数的和为偶数固定,你把奇数个负数转换过来了,又有奇数个正数转换为负数,如此循环始终得不到0)
ac代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 2005;
int a[N];
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,t,minn=2000,pos=0,neg=0,num=0;
scanf("%d",&n);
for(int i=0; i<2*n-1; i++) {
scanf("%d",&t);
minn=min(minn,abs(t));
if(t<0)
neg++;
a[num++]=abs(t);
}
sort(a,a+num);
int ans=0;
for(int i=0; i<num; i++)
ans=ans+a[i];
if(n&1) {
printf("%d\n",ans);
} else {
if(neg&1) {
ans=ans-minn*2;
}
printf("%d\n",ans);
}
}
return 0;
}