Yet Another Yet Another Task

题意:

长度为 (n) 的数组,可以选取一段连续区间去掉其中的一个最大值求和,问求和的最大值为多少。
(-30leq a[i]leq 30)
传送门

分析:

一开始考虑问题的时候, 想得比较偏,一直把重点放在如何找出区间上。
正解:
枚举区间的最大值,求和,必然可以求出答案。

请注意,如果最大总和段上的值等于 mx,则可以忽略这一事实。如果没有,您将使用比实际值小的值更新答案。令最大和段上的实际最大值为 y。
您可以看到,对于 y 和 mx 之间的任何值,最大总和段将始终是所选的那个。因此,当您达到 y 时,将使用正确的值更新答案。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int inf=0x3f3f3f3f;
int a[N];
int main()
{
    int n,ans=-inf;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=-30;i<=30;i++)
    {
        int sum=0;
        for(int j=1;j<=n;j++)
        {
            if(a[j]<=i)
            {
                sum=max(0,sum)+a[j];
                ans=max(ans,sum-i);
            }
        }
    }
    printf("%d
",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/1024-xzx/p/12993913.html