题意:

给你一个含n个数a1,a2...an的数组,你要找到一个区间[l,r],使得al+a(l+1)+...+a(r-1)+ar减去max(al,a(l+1),...,a(r-1),ar)的值尽可能大

n<=1e5

-30<=ai<=30

 

题解:

因为ai的范围特别小,我们可以枚举区间[l,r]的最大值,然后就是暴力循环(这一点看代码)

 

代码:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<deque>
#include<string.h>
#include<map>
#include <iostream>
#include <math.h>
#define Mem(a,b) memset(a,b,sizeof(a))
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2e5+10;
const double eps=1e-6;
const double PI=acos(-1);
int v[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
    }
    int sum = 0;
    int ans = 0;
    for (int i = 0; i <= 30; i++)  //ö�����������ֵ
    {
        sum = 0;
        for (int j = 1; j <= n; j++)
        {
            if( v[j] > i ) sum = 0;
            else
            {
                sum += v[j];
                if( sum < 0 ) sum = 0;
                ans = max(ans,sum-i); //��������
            }
        }
    }
    cout << ans << '\n';
    return 0;
}