题目
题意:给定一组数,选一段连续的区间和减去区间最大值,要求该值最大。
1
<
=
n
<
=
1
e
5
,
−
30
<
=
a
i
<
=
30
1<=n<=1e5,-30<=a_i<=30
1<=n<=1e5,−30<=ai<=30
思路:枚举最大值,然后用最大连续子区间的做法。
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
const int maxn = 100010;
int a[maxn];
int n;
int main() {
scanf("%d",&n);
for(int i = 0;i < n;++i) {
scanf("%d",&a[i]);
}
ll ans = 0;
for(int mx = 0;mx < 31;++mx) {
ll pre = 0;
ll cur = 0;
for(int i = 0;i < n;++i) {
if(a[i] > mx) {
pre = 0;
cur = 0;
} else {
cur = max(pre,0LL) + a[i];
pre = cur;
ans = max(ans,cur-mx);
}
}
}
printf("%lld\n",ans);
return 0;
}