思路:从第一个数字开始求和,得到求和的数列后求出和的最小值 和和的最大值位置,分两种情况:
当和最小值大于0时,说明开始位置是从第一次数字开始的;
当和最小值小于0事,说明开始位置在此位置的后一位;
注意在第一个位置的判断;
得到两个位置后将两个位置之间的数求和
WA,还没想明白;
#include <iostream>
#include <stdio.h>
#define N 100005
#define MAX_N 1005
#define MIN_N -1005
using namespace std;
int number[N];
int temp;
int sum = 0 ;
int maxN = MIN_N;
int minN = MAX_N;
int main()
{
int n,i,j;
int T,flagStart,flagEnd;
cin >> T;
for(int j = 1; j <= T; j++) {
maxN = MIN_N;
minN = MAX_N;
sum = 0;
cin >> n;
for(int i = 0; i<n; i++) {
cin >> temp;
number[i] = temp;
sum += temp;
if(sum > maxN) {
maxN = sum;
flagEnd = i;
}
if(sum <= minN) {
minN = sum;
flagStart = i;
}
}
//cout << maxN <<" " << minN <<endl;
if(minN >= 0){
flagStart = 0;
}
if(flagStart != 0 || number[flagStart] < 0) {
flagStart++;
}
// cout << flagStart << "t" <<endl;
sum = 0;
for( i = flagStart; i <= flagEnd; i++) {
sum += number[i];
}
cout << "Case " << j << ":" << endl;
cout << sum << " " << ++flagStart << " " << ++flagEnd << endl;
cout << endl;
}
return 0;
}