题意:
给出n个非严格递增的整数(可能有负数),必须操作k次,每次可以把其中一个数变为它的相反数,使得最终的数列和最大。输出这个最大和。
考验如何出坑数据卡自己的程序...
#include <cstdio>
const int maxn = 105;
int n, k, num[maxn];
inline int iread() {
int f = 1, x = 0; char ch = getchar();
for(; ch < '0' || ch > '9'; ch = getchar()) f = ch == '-' ? -1 : 1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return f * x;
}
int main() {
int T = iread();
while(T--) {
n = iread(); k = iread();
int cnt = 0, sum = 0;
for(int i = 1; i <= n; i++) {
num[i] = iread();
cnt += (num[i] < 0);
sum += num[i];
}
if(k <= cnt) for(int i = 1; i <= k; i++) sum -= 2 * num[i];
else if(k > cnt) {
for(int i = 1; i <= cnt; i++) sum -= 2 * num[i];
if(cnt == 0) sum -= ((k - cnt) & 1) * 2 * num[1];
else if(cnt < n) {
if(-num[cnt] < num[cnt + 1]) sum += ((k - cnt) & 1) * 2 * num[cnt];
else sum -= ((k - cnt) & 1) * 2 * num[cnt + 1];
} else sum += ((k - cnt) & 1) * 2 * num[cnt];
}
printf("%d\n", sum);
}
return 0;
}
20
1 100
0
1 1
0
2 1
-9 -1
2 100
-9 -1
2 101
-9 -1
3 1
-3 -1 10
3 2
-3 -1 10
3 3
-3 -1 10
3 100
-3 -1 10
3 101
-3 -1 10
3 200
-3 -2 -1
5 200
-3 -2 -1 0 1
5 200
-3 -2 -1 4 5
5 7
0 1 2 3 4
6 4
-3 -2 -1 1 2 3
5 3
0 0 0 0 1
5 4
-2 -1 0 2 5
6 4
-30 -20 -10 100 100 200
6 4
-30 -20 -10 1 2 3
6 1
1 2 3 4 5 6
输出:
0
0
8
10
8
12
14
12
14
12
4
7
13
10
10
1
10
440
64
19