题意:
长度为 (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;
}