题目链接
题意:
给你一个数组,你可以翻转任意一个连续的区间使得该数组偶数位置上的数字之和最大。
思路:
首先我们肯定要翻转偶数长度的区间,因为翻转奇数长度没有任何用处,所以我们只需要判断哪一个区间内的奇数位置的数比偶数位置的数大的更多即可,所以我们将奇数位置的数和前面一个偶数位置的数做差,或者是将偶数位置和他前面的奇数位置的数做差,并对这两个做差得到的区间求最大字段和即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=2e5+5;
const int mod=998244353;
const int inf=0x7fffffff;
const double pi=3.1415926535;
using namespace std;
int arr[N],brr[N/2],crr[N/2];
signed main()
{
IOS;
int t;
cin>>t;
while(t--)
{
int n,m1=0,m=0,num=0,sum=0,ma=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
if(i%2!=0)
{
brr[m]=arr[i]-arr[i-1];
m++;
}
else
{
num+=arr[i];
crr[m1]=arr[i-1]-arr[i];
m1++;
}
}
for(int i=0;i<m;i++)
{
sum+=brr[i];
ma=max(ma,sum);
if(sum<0)
{
sum=0;
}
}
sum=0;
for(int i=0;i<m1;i++)
{
sum+=crr[i];
ma=max(ma,sum);
if(sum<0)
{
sum=0;
}
}
cout<<ma+num<<endl;
}
return 0;
}