仁慈的浩牛哥
涉及知识点:
- 思维
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;
}
原文地址:https://www.cnblogs.com/QFNU-ACM/p/12689714.html
时间: 2024-10-14 15:12:38