[codeforces 1373D] Maximum Sum on Even Positions 翻转不改变相对位置+两种交换形式

Educational Codeforces Round 90 (Rated for Div. 2)   参与排名人数12840

[codeforces 1373D]    Maximum Sum on Even Positions  翻转不改变相对位置+两种交换形式

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址http://codeforces.com/contest/1373/problem/D

ProblemLangVerdictTimeMemory
D - Maximum Sum on Even Positions GNU C++17Accepted93 ms4400 KB

题目大意:给定一个数组,可以至多对其中的连续子序列进行一次翻转,求出所有可能中的,该数组偶数位置上的元素最大和。

样例模拟如下

8
1 7 3 4 7 6 2 9

26

位置0 1 2 3 4 5 6 7
数值1 7 3 4 7 6 2 9
翻转后位置区间[0,7]对应的元素

翻转后
位置0 1 2 3 4 5 6 7
数值9 2 6 7 4 3 7 1

偶数位上元素和9+6+4+7=26

5
1 2 1 2 1

5

位置0 1 2 3 4
数值1 2 1 2 1
翻转后位置区间[0,3]对应的元素

翻转后
位置0 1 2 3 4
数值2 1 2 1 1 

偶数位上元素和2+2+1=5

10
7 8 4 5 7 6 8 9 7 3

37

位置0 1 2 3 4 5 6 7 8 9
数值7 8 4 5 7 6 8 9 7 3
翻转后位置区间[1,2]对应的元素

翻转后
位置0 1 2 3 4 5 6 7 8 9
数值7 4 8 5 7 6 8 9 7 3

偶数位上元素和7+8+7+8+7=37

4
3 1 2 1

5

位置0 1 2 3
数值3 1 2 1

偶数位上元素和3+2=5

可以看到,翻转不改变元素间相对位置。

如位置0 1 2 3 4,位置1可与位置0交换,也可与位置2交换,需要讨论两种交换形式。

交换后,偶数位和值,只需在原来和值的基础上,补上差值即可。

AC代码如下:

#include <cstdio>
#include <algorithm>
#define LL long long
#define maxn 200010
using namespace std;
int a[maxn];
LL sum;
int main(){
	int t,i,n;
	LL cur,delta1,delta2,delta;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(i=0;i<n;i++)scanf("%d",&a[i]);
		sum=0;
		for(i=0;i<n;i+=2)sum+=a[i];
		cur=0,delta1=0;
		for(i=1;i<n;i+=2){//位置0与位置1交换
			cur+=a[i]-a[i-1];//cur用来计算连续区间内,交换后的差值
			delta1=max(delta1,cur);
			if(cur<0)cur=0;//重新开始新的区间
		}
		cur=0,delta2=0;
		for(i=2;i<n;i+=2){//位置2与位置1交换
			cur+=a[i-1]-a[i];
			delta2=max(delta2,cur);
			if(cur<0)cur=0;//重新开始新的区间
		}
		delta=max(delta1,delta2);
		sum+=delta;
		printf("%lld\n",sum);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值