时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC
Description
一个整数序列,选出其中连续且非空的一段使得这段和最大。
注意当题目要求输入输出的数据量很大时,尽量使用scanf和printf。 c++提供的cin和cout速度比较慢,有可能在读取数据和输出数据时导致超时。
输入格式
第一行是一个正整数N,表示了序列的长度(0=<N<=200000)。 第二行包含N个绝对值不大于10000的整数ai。
输出格式
一个整数,为最大的子段和。子段的最小长度为1。数据确保结果在类型int范围内。
输入样例
7 2 -4 3 -1 2 -4 3
输出样例
4
提示
【样例说明】 2,-4,3,-1,2,-4,3中,最大的子段和为4,该子段为第三元素至第五元素,即3,-1,2。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6;
int a[N],sum[N];
int ans;
int main()
{ ios::sync_with_stdio(0),cin.tie(0);
int n;
cin>>n;
int biggest=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
ans+=a[i];
biggest=max(biggest,ans); //记录贪心最大子段和
if(ans<0)ans=0; //当产生负贡献更新ans
}
cout<<biggest;
return 0;
}
**注意n的最大值超过1e4,o2的复杂度会超时