/*
* 1. 最小的i和j
* 2. 若序列全为0,输出头尾元素。
*/
#include <iostream>
using namespace std;
int main(void) {
bool isNegative(true); //记录序列是否全为负数
int first(0), last(0); //记录第一个和最后一个输入数据。
//当前和、最大和、最小i、最小j、当前i。
int thisSum(0), maxSum(0), si(0), sj(0), currI(0);
bool isFirst(true); //标记子序列的第一个数字,辅助选出最小i。
int n, data;
cin >> n;
for(int m(0); m < n; ++m) {
cin >> data;
if(isNegative && data >= 0) isNegative = false;
if(m == 0) first = data;
if(m == n - 1) last = data;
thisSum += data;
if(isFirst && thisSum >= 0) {
currI = data; //当前子序列的最小i
isFirst = false;
}
if(thisSum > maxSum) {
si = currI; //thisSum > maxSum时,thisSum是最大子列,si更新。
maxSum = thisSum;
sj = data;
}
else if(thisSum < 0) {
thisSum = 0;
isFirst = true;
}
}
if(isNegative) cout << 0 << " " << first << " " << last;
else cout << maxSum << " " << si << " " << sj;
return 0;
}
01-复杂度2 Maximum Subsequence Sum (25分)
最新推荐文章于 2024-04-23 14:27:42 发布