Description
一个整数序列,选出其中连续且非空的一段使得这段和最大。
注意当题目要求输入输出的数据量很大时,尽量使用scanf和printf。 c++提供的cin和cout速度比较慢,有可能在读取数据和输出数据时导致超时。
输入格式
第一行是一个正整数N,表示了序列的长度(0=<N<=200000)。 第二行包含N个绝对值不大于10000的整数ai。
输出格式
一个整数,为最大的子段和。子段的最小长度为1。数据确保结果在类型int范围内。
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
int ans=-10000;
int a[200005];//储存前缀和
int b[200005];//储存最小前缀和
int main()
{
int n;int x;int i;
scanf("%d",&n); //输入数字个数
for(i=1;i<=n;i++){
scanf("%d",&x); //输入数据
a[i]=a[i-1]+x; //得到各段的前缀和,存储在a[i]中,a[0]=0
b[i]=min(b[i-1],a[i]); //得到最小前缀和
ans=max(a[i]-b[i],ans); //前缀和减去最小前缀和,即为结果
}
printf("%d",ans);
}