zzuli 1899 985的最大和难题

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”“个”数变号的意思。。。。。。。。

原谅我太菜,,,

看懂了题,就好写了;

很好证明,当为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[N];
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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值