码迷,mamicode.com
首页 > 其他好文 > 详细

4月13日题解

时间:2020-04-13 10:44:40      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:stream   return   href   最大值   mes   font   ref   names   mat   

仁慈的浩牛哥

涉及知识点:

  • 思维

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

4月13日题解

标签:stream   return   href   最大值   mes   font   ref   names   mat   

原文地址:https://www.cnblogs.com/QFNU-ACM/p/12689714.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!