Educational Codeforces Round 90 (Rated for Div. 2)
D. Maximum Sum on Even Positions
解题思路:首先将问题的多种不同情况列出来,发现有两种情况。
这种数组的问题好像经常会有差分数组的构造。,下次解不出来构造一下差分数组。
由于求的是连续的,所以构造差分数组,后求连续子段和,并且复杂度是O(n),满足。
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
const int inf=0x7fffffff;
const int in=1e9+7;
int n,m;
int a[N],s1[N],s2[N];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
int n,cnt1=0,cnt2=0;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=2;i<=n;i+=2)
s1[cnt1++]=a[i]-a[i-1];
for(int i=2;i<n;i+=2)
s2[cnt2++]=a[i]-a[i+1];
ll sum1=0,sum2=0,ans1=0,ans2=0;
for(int i=0;i<cnt1;i++)
{
if(sum1<0)sum1=0;
sum1+=s1[i];
ans1=max(ans1,sum1);
}
for(int i=0;i<cnt2;i++)
{
if(sum2<0)sum2=0;
sum2+=s2[i];
ans2=max(ans2,sum2);
}
sum1=0;
for(int i=1;i<=n;i+=2)
sum1+=a[i];
cout<<sum1+(max(ans1,ans2))<<endl;
}
return 0;
}