解题思路:
1.将输入的数字存入数组,然后从第一个开始循环判断到最后一个
2.sum累加当前数,如果值大于max,更新rightindex、leftright和max,用来记录队尾,但是如果sum值小于0,表示到目前位置的序列无效,因为负数只会拖累后面的出现的正数
3.设置一个中间变量tempindex,用来指向新序列列头 规则是如果当前sum是0,指向下一个相邻的数
4.题中还要求如果全是负数,输出sum为0,并输出第一个和最后一个数,可以设置max初值为 -1,在最后如果max还是 -1 表示sum从未有过大于 -1的情况,意味着全是负数,按规则输出数即可
#include<iostream>
using namespace std;
int main()
{
int k,sum=0,max=-1,rightindex,leftindex,tempindex;//tempindex记录新的有效的队头
cin>>k;
int num[10005]={0};
for(int i=0;i<k;i++)
{
cin>>num[i];
}
for(int i=0;i<k;i++)
{
sum+=num[i];
if(sum<0)//之前计算的值全都无效
{
tempindex=i+1;
sum=0;
}
else if(sum>max)
{
leftindex=tempindex;
rightindex=i;
max=sum;
}
}
if(max==-1)cout<<0<<" "<<num[0]<<" "<<num[k-1];//全是负数的情况
else
{
cout<<max<<" "<<num[leftindex]<<" "<<num[rightindex];
}
return 0;
}