A. Yaroslav and Sequence

本文探讨了Yaroslav面对一个包含(2·n-1)个整数的序列时,如何通过有限次操作(每次操作选择n个元素翻转符号)获得最大可能的序列和。文章详细解析了解决方案,并提供了实现该算法的C++代码。
A. Yaroslav and Sequence
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Yaroslav has an array, consisting of (2·n - 1) integers. In a single operation Yaroslav can change the sign of exactly n elements in the array. In other words, in one operation Yaroslav can select exactly n array elements, and multiply each of them by -1.

Yaroslav is now wondering: what maximum sum of array elements can be obtained if it is allowed to perform any number of described operations?

Help Yaroslav.

Input

The first line contains an integer n (2 ≤ n ≤ 100). The second line contains (2·n - 1) integers — the array elements. The array elements do not exceed 1000 in their absolute value.

Output

In a single line print the answer to the problem — the maximum sum that Yaroslav can get.

Sample test(s)
input
2
50 50 50
output
150
input
2
-1 -100 -1
output
100
Note

In the first sample you do not need to change anything. The sum of elements equals 150.

In the second sample you need to change the sign of the first two elements. Then we get the sum of the elements equal to 100.

这道题相同了其实很简单,我先简单介绍下题目意思:Yaroslav有一个整数数列,长度为2*n-1个,Yaroslav想得到最大的数列和,但是他只能一次改变这个数列中n个元素的符号(即正数变负数,负数变正数,例如:假设n=3,数列长度为2*3-1=5个数列:1 1 1 1 1,Yaroslav一次只能改变这数列其中3个元素的符号使其变成-1 -1 -1 1 1或者1 1 -1 -1 -1等等),现在问题是允许Yaroslav无数次重复这个操作(即一次改变n个元素的符号)怎样才能得到最大的数列和?下面就说这道题的思路:
假设n为奇数时,这时我们可以想,无论怎样变,我们一次改变n个元素符号,就一定会使最后的数列全变成正整数,因为变换n个元素(不管原来是正是负)都可以相当于一次增加或减少1个负数,这样可以直到有n个负数,然后全变为整数,不信自己可以拿张纸随意写几个奇数个元素试试。
假设n为偶数时,这时我们要分情况讨论,因为变换n个元素详相当于可以一次增加或减少2个负数,所以当有偶数个负数时都可以变为正数,当有奇数个负数时,最大和为绝对值最小的那个为负数(这里注意:不是负数里绝对值最小的,是整个数列最小的),其余的都为正数。
下面附上代码:
#include<iostream>
const int MAX=10000;
int s[MAX];
using namespace std;
int main()
{
int n,i,j,fushu,sum,MIN;
cin>>n;
fushu=0;
sum=0;
MIN=MAX;
for(i=1;i<=2*n-1;i++)
{
cin>>s[i];
if(s[i]<0)
{
fushu+=1;
s[i]=-s[i];
}
if(s[i]<MIN)
MIN=s[i];
sum+=s[i];
}
if(n%2!=0)
{
cout<<sum<<endl;
}
else
{
if(fushu%2!=0)
cout<<sum-MIN*2<<endl;
else
cout<<sum<<endl;
}
return 0;
}//如果有问题,或有什么疑惑,可以在评论中提出,小子我看到一定尽力解答
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值