现在的位置: 首页 > 综合 > 正文

A. Yaroslav and Sequence

2018年05月02日 ⁄ 综合 ⁄ 共 1801字 ⁄ 字号 评论关闭
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;
}//如果有问题,或有什么疑惑,可以在评论中提出,小子我看到一定尽力解答

抱歉!评论已关闭.