【SPOJ-GSHOP】Rama and Friends【贪心】【细节】

题意:

给出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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值