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
这是考查思维的题,发现自己越来越像菜鸟,死都不说自己像菜鸡,(菜鸟好听)啦啦啦啦;
其实就是把所有的数按正负分为两个集合,正的集合个数为X,负的为y,分别从其中拿出a,b个数,使a+b=n;
如果n是奇数的话,那么所有的负数都可以变成正数。如果n为偶数,再看负的个数Y为奇为偶,如果为偶那么
所有的负数都可以变为正数,如果为奇数,肯定剩余一个无法变成正数,就把所有数取绝对值后最小的那个便
成负就可以了。
#include<stdio.h> #include<string.h> #include<math.h> int main() { int t,n,i,b; scanf("%d",&t); while(t--) { int cnt=10000,f=0,z=0,sum=0; scanf("%d",&n); for(i=0;i<2*n-1;i++) { scanf("%d",&b); if(b<0) f++; sum+=abs(b); if(abs(b)<cnt) cnt=abs(b); } if(n%2==1||(n%2==0&&f%2==0)) printf("%d\n",sum); else printf("%d\n",sum-2*cnt); } return 0; }