4.13每日一题题解

仁慈的浩牛哥

涉及知识点:

  • 思维

solution:

  • \(祝大家周一愉快\)
  • \(这个题目首先从数据范围我们知道,n^2的做法是不可取的\)
  • \(所以我们应该想到一种O(n)的做法,或者是O(nlogn),或者更好的做法\)
  • \(对于每个数我们都有被删除的可能性,所以对于当前的数字a[i],我们需要计算出这个数加上若干个前面连续的数的最大值\)
  • \(比如 5,-9,10,6,-3\)
  • \(的pre数组的值就是 5,-4,10,16,13\)
  • \(那么我们计算出next也就很简单了, 12,7,16,6,-3\)
  • \(那么我们再处理每个数删除情况就分为以下三种情况\)
  • \(pre[i - 1] + Next[i + 1],pre[i - 1],Next[i + 1] 三者中的最大值\)

std:

#include <iostream>
#include <algorithm>
#include <vector>
#include <sstream>
using namespace std;

const int N = 1e5 + 10;

int a[N];
int pre[N];
int Next[N];

int n;
int main()
{
    cin >> n;
    int res = -0x3f3f3f3f;
    for(int i = 1;i <= n;i ++)
    {
        cin >> a[i];
    }
    
    int sum = 0;
    
    for(int i = 1;i <= n;i ++)
    {
        sum += a[i];
        res = max(res,a[i]);
        pre[i] = max(a[i],sum);
        if(sum < 0)sum = 0;
    }
    sum = 0;
    for(int i = n;i >= 0;i --)
    {
        sum += a[i];
        Next[i] = max(sum,a[i]);
        if(sum < 0)sum = 0;
        
    }
    
    for(int i = 1;i <= n;i ++)
    {
        res = max({pre[i - 1] + Next[i + 1],pre[i - 1],Next[i + 1],res});
    }
    
    cout << res << endl;
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/QFNU-ACM/p/12689714.html
今日推荐