Codeforces 1359D


Educational Codeforces Round 88 (Rated for Div. 2) - D

题意

要求找到“区间和-区间最大值”的最大值


限制

Time limit per test: 1.5 seconds

Memory limit per test: 512 megabytes

1≤n≤105

−30≤ai≤30




解题思路

因为答案最小为 0

所以可以从 1 到 30 枚举可能的区间最大值

然后遍历寻找最大子段和

如果遍历到位置 i 时,前一段子段和小于 0 ,说明已经不是最优解,此时置和为 0

如果遍历到位置 i 时,位置 i 的值 a[i] > 枚举出的区间最大值 mx ,此时不符假设,说明第 i 个位置不可取,sum置 0

总复杂度为 O(30n)




完整程序

#include<bits/stdc++.h>
using namespace std;
int a[100050];

int main()
{
    int n,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int mx=1;mx<=30;mx++) //枚举最大值
    {
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>mx) //不符假设
            {
                sum=0;
                continue;
            }
            sum+=a[i];
            if(sum<0)
                sum=0;
            ans=max(ans,sum-mx);
        }
    }
    printf("%d
",ans);
    
    return 0;
}

原文地址:https://www.cnblogs.com/stelayuri/p/12986700.html