要求:
全负数:输出0,开始元素,结束元素。
多个相同大小子数列:输出坐标小的。
主要考虑两种特殊情况
1.只有0和负数。(因为当前和为负数时会被置0,所以设置fakezero判断是否遇到了0。)
2.最大子数列和为正,且在最大子数列前有很多0。(在最后过滤掉起始位置的所有0。)
#include<iostream>
using namespace std;
int main() {
int arr[10000];
int a;
cin >> a;
int max = -1;
int cur = 0;
int start = 0;
int end = 0;
int cur_start = 0;
bool allneg = true;
bool fakezero = true;
for (int i = 0; i < a; ++i) {
cin >> arr[i];
}
for (int i = 0; i < a; ++i) {
if (allneg)
if (arr[i] >= 0)
allneg = false;
cur += arr[i];
if (cur < 0) {
cur = 0;
cur_start = i + 1;
}
if(fakezero)
if (arr[i] == 0) {
start = i;
end = i;
fakezero = false;
}
if (cur > max) {
if(cur>0)
fakezero = false;
max = cur;
if (!fakezero) {
end = i;
start = cur_start;
}
}
}
if (max > 0) {
while (arr[start] == 0)
++start;
}
if(allneg)
cout << 0 << ' ' << arr[0] << ' ' << arr[a-1] << endl;
else
cout << max << ' ' << arr[start] << ' ' << arr[end] << endl;
return 0;
}