zzuli 1899 985的最大和难题
2016-08-06 17:46
417 查看
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 -10Sample Output
340这一题的题意,真是难到我了,我无奈去百度题解,看了好久才终于意识到了每次把“n”“个”数变号的意思。。。。。。。。
原谅我太菜,,,
看懂了题,就好写了;
很好证明,当为n为奇数时一定能全变为偶数。
而当n为偶数时,小于零的数的个数也为偶数,也能全变成偶数。
其他情况不能,所以把绝对值最小的负数去掉,从而满足上述情况。再减去减去的负值;
因为看了题解,我发现有的题解是错的。没有考虑最初的情况是否最大。
比如: 输入2, 三个数为1 1 -1 肯定选择不变,
输出为2;
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define LL long long
#define N 200005
#define mod 1000000007
int dp
;
int main()
{
int t,n,nu,k,sum,minn,s;
scanf("%d",&t);
while(t--)
{
k=0,sum=0,minn=99999999,s=0;
scanf("%d",&n);
for(int i=0;i<2*n-1;i++)
{
scanf("%d",&nu);
if(nu<0) k++;
else s+=nu;
sum+=abs(nu);
minn=min(minn,abs(nu));
}
if(n&1||(n%2==0&&k%2==0))
printf("%d\n",sum);
else
printf("%d\n",max(s,sum-2*minn));
}
return 0;
}
相关文章推荐
- zzuli 1899: 985的最大和难题
- zzuli 1899 Problem H: 985的最大和难题
- 【zzuli-oj】-1899-985的最大和难题(思维,好)
- 【郑轻】[1899]985的最大和难题
- 【zzuliOJ】1899 - 985的最大和难题(思维,好题)
- zzulioj-1899-985的最大和难题【思维】
- 1899: 985的最大和难题(好题)
- zzulioj 1899: 985的最大和难题 [规律]
- zzulioj 1899(985的最大和难题)
- 郑轻 1899 985的最大和难题
- zzulioj1899 985的最大和难题(思维)
- 1899: 985的最大和难题
- 郑轻OJ/ ZZULIOJ 1899 985的最大和难题(思维)
- ZZULI OJ 1899 985的最大和难题
- 1899: 985的最大和难题
- zzuli 1990 985的“树”难题
- 985的最大和难题
- 【985系列】985的最大和难题
- zzuli 1893 985的数学难题
- ZZULI-oj 1157 985的数字难题 (数学小规律)