(比较懒,英文版原题就不翻译了,我等小白借助有道词典读题的)原题要求输出最大子列和、最大和的子列第一个数和最后一个数,有并列和的情况输出最小下标。多次尝试后一直有一个并列和相同i不同j,即尾0。的测试通不过,睡了一觉理解了,这个测试点的情况为,存在两个最大和子列,且间隔一个sum=0:具体为:
10
-10 1 2 3 4 -10 3 7 0 -21
#include <stdio.h>
int main(int argc,char const *argv[]){
int sum=0,num=0,max=-1,k=0,flag=0; //sum=当时和、num=读取值、max=最大和、k=读取次数、flag=负数读取开关
int first=0,last=0,temp=0,p=0;//first=最大和子列的第一个值、last=最大和子列的最后一个值、temp=当时和的第一个值、p=读取的第一个值
scanf("%d",&k);
int i=k; //用i控制读取次数,方便记录某次读取值,本程序中是为了记录全负数情况下第一个读取值p
while(i--){
scanf("%d",&num);
if(i==k-1) p=num;
if(num>=0||flag==1){ //当第一次读取大于等于0的值,开始累加;
if(flag==0) temp=num; //flag==0,说明此时sum==0,读取的第一个temp记录读取的第一个非负数
sum+=num; //累加
flag=1; //打开开关,下个值无论正负或0都应该读取
if(sum>max){
max=sum;
first=temp; //当sum大于max,更新max,更新first,更新last
last=num;
}
if(sum<0){
sum=0; //当时和小于0时,无法增大后面的和,舍弃,sum=0;flag关闭负数读取开关,跳过负数读取。
flag=0;
}
}
}
if(max==-1){
max=0;
first=p;
last=num;
}
printf("%d %d %d",max,first,last);
return 0;
}