Max Sum(HDU 1003)

来源:互联网 发布:猫眼网络大电影数据 编辑:程序博客网 时间:2024/06/07 08:08

题意:

求最大子段和

思路:

这题刚开始做时没想那么多,还是用的以前的方法。用双重循环,遍历找起点和终点。然后 。。。。。就超时了。因为用了二重循环,N的最大值为100000,时间复杂度为O(N^2)。第二篇代码看了大神的。。。。。居然可以只遍历一遍抓狂抓狂抓狂把每个数依次相加,只要相加后的数小于零累加的变量就重新付零,还有每加一次就要判断是否为最大值。

做这道题要把正数和负数连系起来,想想全为负数的情况,如果全为负就只要找最大值。全为正字段和就是整个数组了。正负都有,连续相加时大于零就取最大值,当连续相加小零了,就要从零开始计数(小于零的数没有子段和为单个值)。虽然写了这么多,但这题觉还是没有理的很透彻。。。。。。

上人代码了

#include <iostream>#include <cstdio>using namespace std;int T;int N;int main(){    int Case=1;    scanf("%d",&T);    while(T--)    {        int x,y,Max=-1010;        int sum=0;        int m=1;        scanf("%d",&N);        for(int i=1;i<=N;i++)        {            int temp;            scanf("%d",&temp);            sum+=temp;            if(sum>Max)                {                    Max=sum;                    x=m;                    y=i;                }            if(sum<0)            {                sum=0;                m=i+1;            }        }        printf("Case %d:\n",Case++);        printf("%d %d %d\n",Max,x,y);        if(T)            cout<<endl;    }    return 0;}



0 0
原创粉丝点击