hdu_1003

来源:互联网 发布:windows php扩展下载 编辑:程序博客网 时间:2024/05/22 11:37
算法与分析 第二章 for(i=0;i<n;i++){    nowsum+=a[i];    if(nowsum>max) max=nowsum;    else if(nowsum<0) nowsum=0;} 

上面代码适用于 max一定为正值的情况。
而hdu1003 是可以出现负值的,所以当nowsum<0时 不能直接赋值为0。

#include <stdio.h>int t;int a[100002];int main(){    scanf("%d",&t);    int t1=1;    while(t1<=t){        int n,i,j;        scanf("%d",&n);        a[0]=0;        int maxn,maxi,maxj,nowsum=0;        i=1;        maxn=-1000*100000-1; //可以出现负值         for(j=1;j<=n;j++){            scanf("%d",&a[j]);            if(nowsum<0) nowsum=a[j],i=j;            else {                nowsum+=a[j];            }            if(nowsum>maxn){                maxn=nowsum;                maxj=j;                maxi=i;            }           }        if(t1!=1) printf("\n");        printf("Case %d:\n",t1++);        printf("%d %d %d\n",maxn,maxi,maxj);    }}

我们可以分类讨论 一类是max大于0,可以用最上面的代码,一类是max小于0,也很容易得到

#include <stdio.h>int t;int a[100002];int main(){    scanf("%d",&t);    int t1=1;    while(t1<=t){        int n,i,j;        scanf("%d",&n);        a[0]=0;        int maxn,maxi,maxj,nowsum=0;        i=1;        maxn=-1000*100000-1; //可以出现负值         //最大值是负的        int maxnn=maxn,maxnni;         for(j=1;j<=n;j++){            scanf("%d",&a[j]);            if(a[j]>maxnn) maxnn=a[j],maxnni=j;            nowsum+=a[j];            if(nowsum<0) nowsum=0,i=j+1;            else if(nowsum>maxn){                maxn=nowsum;                maxj=j;                maxi=i;            }           }        if(t1!=1) printf("\n");        printf("Case %d:\n",t1++);        if(maxn>0) printf("%d %d %d\n",maxn,maxi,maxj);        else printf("%d %d %d\n",maxnn,maxnni,maxnni);    }}
原创粉丝点击