codeforces训练(rating1400-1800)

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;
}

猜你喜欢

转载自blog.csdn.net/zhoucheng_123/article/details/108083300