关键在于记录始末值以及没有非负数时的处理。
#include <iostream>
#include <stdio.h>
/*
Created by HarvestWu on 2018/04/27.
*/
int main()
{
int n;//序列数据量
int positiveFlag = 0;//记录是否有非负数
int firstFlag = 1;//记录是否接收的第一个数
int reFlag = 1;//记录是否重新开始新的子列
int sum = 0, maxSum = 0;//当前子列和、子列最大值
int start = 0, end = 0;//记录当前子列的始、末值
int maxStart = 0, maxEnd = 0;//记录最大子列的始、末值
int first = 0, t = 0;//记录第一个数据、当前输入的数据
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &t);
if (t >= 0)
positiveFlag = 1;//有非负数,意味着最大值>=0
if (firstFlag)//接收第一个数据
{
first = t;
firstFlag = 0;
}
if (reFlag)//重新开始记录子列始值
{
start = t;
reFlag = 0;
}
sum += t;//当前子列和
end = t;//子列末值
if (maxSum<sum)
{
maxSum = sum;
maxStart = start;
maxEnd = end;
}
if (sum < 0)
{
sum = 0;
reFlag = 1;
}
}
if (positiveFlag)//如果含非负数,输出最大子列和及其始末值
{
printf("%d %d %d", maxSum, maxStart, maxEnd);
}
else //都是负数则输出子列和0及最前、最末值
printf("%d %d %d", maxSum,first,t);
return 0;
}