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.
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.
In the single line print the answer to the problem — the maximum total income that we can obtain after exactly k changes.
3 2 -1 -1 1
3
3 1 -1 -1 1
1
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.
题意:给出 n和k以及 n个非递减的数, 求其中的数改变k次符号后的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
using namespace std;
const int INF = 0x7fffffff;
int main()
{
// freopen("1.txt", "r", stdin);
int n, k;
while(cin >> n >> k)
{
int a[100050];
int pcnt = 0;
int absmin = INF;
int index = 0;
for(int i = 0; i < n; ++i)
{
cin >> a[i];
if(abs(a[i]) < absmin)
{
absmin = abs(a[i]);
index = i;
}
if(a[i] < 0)
pcnt++;
}
if(pcnt < k)
{
for(int i = 0; i < n; ++i)
{
if(a[i] < 0)
a[i] *= -1;
}
k -= pcnt;
if(k%2)
{
a[index] *= -1;
}
}
else
{
for(int i = 0; i < k; ++i)
a[i] *= -1;
}
__int64 ans = 0;
for(int i = 0; i < n; ++i)
ans += a[i];
cout << ans << endl;
}
return 0;
}
和最大值。
分k > 负数个数和k > 负数个数讨论。当k > 负数个数时,要讨论k - 负数个数是奇数还是偶数。
要注意,求绝对值最小的那个数的时候,维护的时候 切不可写成:
if(abs(a[i]) < absmin)
{
absmin =a[i];
index = i;
}
//就因为这个错误,WA了9遍
ac代码: