您的位置:首页 > 其它

codeforces 160 Div2 B

2013-01-15 02:20 218 查看
B. Roma and Changing Signs

time limit per test
2 seconds

memory limit per test
256 megabytes

input
standard input

output
standard output

Roma works in a company that sells TVs. Now he has to prepare a report for the last year.

Roma has got a list of the company's incomes. The list is a sequence that consists of n integers. The total income of the company is the sum of all integers in sequence. Roma decided to perform exactly k changes of signs of several numbers in the sequence. He can also change the sign of a number one, two or more times.

The operation of changing a number's sign is the operation of multiplying this number by -1.

Help Roma perform the changes so as to make the total income of the company (the sum of numbers in the resulting sequence) maximum. Note that Roma should perform exactly k changes.

Input
The first line contains two integers n and k (1 ≤ n, k ≤ 105), showing, how many numbers are in the sequence and how many swaps are to be made.

The second line contains a non-decreasing sequence, consisting of n integers ai (|ai| ≤ 104).

The numbers in the lines are separated by single spaces. Please note that the given sequence is sorted in non-decreasing order.

Output
In the single line print the answer to the problem — the maximum total income that we can obtain after exactly k changes.

Sample test(s)

input
3 2
-1 -1 1


output
3


input
3 1
-1 -1 1


output
1


Note
In the first sample we can get sequence [1, 1, 1], thus the total income equals 3.

In the second test, the optimal strategy is to get sequence [-1, 1, 1], thus the total income equals 1.

先对数组排序,一开始用冒泡,结果超时了QAQ,改快排了。然后分两种情况,负数大于等于 change次数的 直接把负数从小到大依次change。负数比change次数小的,把负数都change,再排序,剩下change次数都对最小的数操作。

附代码:

#include<stdio.h>
#include<stdlib.h>

int arr[100000]={0};

int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}

int main(void)
{
int n, k, i, j, sum=0, count=0;
int temp;

scanf("%d %d", &n, &k);
for( i=0; i<n; i++)
{
scanf("%d", &arr[i]);
if( arr[i]<0 )
count++;
}
qsort( arr, n, sizeof(int), cmp);
if( count>k)
{
for( i=0; i<k; i++)
arr[i]*=-1;
}
else if( count == k)
{
for( i=0; i<k; i++)
arr[i]*=-1;
}
else
{
for( i=0; i<count; i++)
arr[i]*=-1;
qsort( arr, n, sizeof(int), cmp);
for( i=0; i<(k-count); i++)
arr[0]*=-1;
}
for( i=0; i<n; i++)
sum+=arr[i];
printf("%d", sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: