题目链接
题目大意
可以最多翻转一次连续的数组(即子串)求这个数组下标为偶数的和的最大值(数组下标以0开始)
题目思路
首先观察发现翻转奇数个数元素没用,翻转偶数才能改变下标奇偶
和类似于求最大连续子段一样,但是这个可能是从0开始翻转,也可能从1开始翻转
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int mod=1e9+7;
int t,n,a[maxn];
int main(){
scanf("%d",&t);
while(t--){
ll ans=0;
scanf("%d",&n);
for(int i=0;i<=n-1;i++){
scanf("%d",&a[i]);
if(i%2==0){
ans+=a[i];
}
}
ll pre1=0,pre2=0,ma1=0,ma2=0;
for(int i=0;i<=n-2;i+=2){
pre1+=(a[i+1]-a[i]);
if(pre1<0){
pre1=0;
}
ma1=max(ma1,pre1);
}
for(int i=1;i<=n-2;i+=2){
pre2+=(a[i]-a[i+1]);
if(pre2<0){
pre2=0;
}
ma2=max(ma2,pre2);
}
ans+=max(ma1,ma2);
printf("%lld\n",ans);
}
return 0;
}