该题题意:计算最大子序列和,并输出该序列第一个以及最后一个数。
坑点:
当所有数为负数时 输出最大和为0 同时还要把序列中第一个以及最后一个输出出来
当输入的序列都是0时 要输出 0 0 0
#include<stdio.h>
int main()
{
int k,i,j=0,num,thismax=0,themax=0,ret=0;
int a[100000]={0},maxi,cnt=0;
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d",&a[i]);
if(a[i]<0)
ret++;
thismax+=a[i];
if(thismax<0) //thismax用来更新序列和
{
thismax=0;
}
if(thismax>themax)
{
int flag=thismax; //flag记录thismax 然后用一个循环找到序列中第一个数(即回到最初点)
for(j=i;flag>0;flag-=a[j],j--){}
j+=1;
themax=thismax;
maxi=i;
}
}
if(themax==0&&ret==k)
printf("0 %d %d",a[0],a[k-1]);
else if(themax==0&&ret!=k)
printf("0 0 0");
else if(j<0) //当出现诸如 1 2 3 4 -10 -6 -7 这样最大子序列在前面的 我们只要输出a[0]就行了
printf("%d %d %d",themax,a[0],a[maxi]);
else
printf("%d %d %d",themax,a[j],a[maxi]);
return 0;
}