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