Educational Codeforces Round 88 (Rated for Div. 2)
题意:定义一个区间的值 = 区间和 - 最大值(重复的只删一次),求给定数组的最大值
思路:由于ai很小,可以直接枚举最大值。
AC代码:
int n;
int a[200005];
void work(){
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
int ans=0;
for(int i=1;i<=30;++i){ // 答案一定 >= 0
int sum=0;
for(int j=1;j<=n;++j){
if(a[j]<=i){
sum=max(0, sum)+a[j]; // 如果之前 < 0, 那么前面那一段要舍去,只要前面的和是正的,就要拿着
// 对于前面那一段的和,如果存在某一个后缀和 > 总和,那么前面一定存在某段区间的和 < 0,但这个在前面是被判掉的,所以说不存在这种情况
ans=max(ans, sum-i);
}
else maxsum=0;
}
}
cout<<ans<<'\n';
}