1899: 985的最大和难题

来源:互联网 发布:淘宝登录框打不开 编辑:程序博客网 时间:2024/05/16 12:41

1899: 985的最大和难题

Time Limit: 1 Sec  Memory Limit: 128 MB

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=3时的负数变化

(0为负数1为正数)
有一个:
0 1 1 1 1
1 0 0 1 1
1 0 1 0 0
1 1 1 1 1
有两个:
0 0 1 1 1
0 1 0 0 1

1 1 1 1 1
有三个:
0 0 0 1 1

1 1 1 1 1

总结规律:


负数正数02n-1n-112n-2n-1n2n-4n-3 n+2…………

可发现若n为奇数时

总可以把负数全部变为正数

当n为偶数时

每次能改变偶数个负数

所以若负数的个数为偶数个

也能全部变为正数

当负数的个数为奇数个

总会留下一个数为负数

(但不一定是原来就有的负数)

为了让总和最大

可以使绝对值最小的数为负数


[cpp] view plain copy
 print?
  1. #include<stdio.h>   
  2. int main() {   
  3.     int T;   
  4.     scanf("%d",&T);   
  5.     while(T--) {   
  6.         int n;   
  7.         scanf("%d",&n);   
  8.         int l=2*n-1;   
  9.         int sum=0,cnt=0,res=99999999;   
  10.         for(int i=0; i<l; i++) {   
  11.             int t;   
  12.             scanf("%d",&t);   
  13.             if(t<0) {   
  14.                 cnt++;   
  15.                 t=-t;   
  16.             }   
  17.             if(res>t)   
  18.                 res=t;   
  19.             sum+=t;   
  20.         }   
  21.         if(n&1||cnt%2==0)   
  22.             printf("%d\n",sum);   
  23.         else  
  24.             printf("%d\n",sum-2*res);   
  25.     }   
  26.     return 0;   
  27. }   
0 0
原创粉丝点击