luogu P1115 最大字段和

来源:互联网 发布:禁止windows自动更新 编辑:程序博客网 时间:2024/05/22 00:19

题目描述

给出一段序列,选出其中连续且非空的一段使得这段和最大。

输入输出格式

输入格式:
输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度。

第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列。

输出格式:
输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少。子段的最小长度为1。

输入输出样例

输入样例#1: 复制
7
2 -4 3 -1 2 -4 3
输出样例#1: 复制
4
说明

【样例说明】2 -4 3 -1 2 -4 3

【数据规模与约定】

对于40%的数据,有N ≤ 2000。

对于100%的数据,有N ≤ 200000。

好像方法很多,然后我简单讲一下思路,虽然我并不知道我讲的是什么方法。(可能是贪心?)
最简单的方法是可以避开数组的,即边输入边运算。
我们假设最大结果数是MAX,每输入一个数我们就将其统计相加得到当时的一个值t。然后将t与MAX比较可以得到当时为止的最大结果数。另外,此时为防止MAX比t要大无法得到有效值,我们将MAX定一个最小的初值。
另外一点就是当t小于0时,相当于加上前面的字段最大结果数变小,于是这个时候我们可以将前面的字段去除,即将t重新赋为0.
贴上代码:

#include <cstdio>#include<algorithm>using namespace std;int main(void){    int N,n,MAX=-200000,t=0;    scanf("%d",&N);    for(int i=1;i<=N;i++)    {        scanf("%d",&n);        t=t+n;        MAX=max(t,MAX);        if(t<0)        t=0;    }    printf ("%d",MAX);    return 0;}
原创粉丝点击