题目链接:点击打开链接
1899: 985的最大和难题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 334 Solved: 44
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
这个思维题挺好的,看一下别人的思路。
下面说一个题解:
对于给的每一个数,我们记录里面非负数的个数x,负数的个数y,和绝对值之和,和绝对值最小的数(后面用到了再细谈)
我们每次要从x集合拿a个数,y集合拿b个数,且a+b == n,那么如果n为奇数的话,y集合的负数是可以都变成正数的(方法合理即可)。
如果n为偶数,那么我们只能改变偶数个数,那么就判断y集合的元素是奇数还是偶数,如果是偶数,那么也可以全部变成正数;如果是奇数,那么总有一个数不能变成正数,那么我们为了得到最优解,就让绝对值最小的为负数,sum
- 2*minn即可。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int a[1010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int sum=0,cnt=0,mmin=1010;
for(int i=1;i<2*n;i++)
{
scanf("%d",&a[i]);
if(a[i]<0)
{
cnt++;
}
sum+=abs(a[i]);
mmin=min(mmin,abs(a[i]));
}
if(n&1)
printf("%d\n",sum);
else
{
if(cnt&1)
printf("%d\n",sum-2*mmin);
else
printf("%d\n",sum);
}
}
return 0;
}