-
输入有多组数据,每组测试数据包括两行。
第一行为一个整数n(0<=n<=100000),当n=0时,输入结束。接下去的一行包含n个整数(我们保证所有整数属于[-1000,1000])。
九度oj http://ac.jobdu.com/problem.php?pid=1372
输入:
-
输出:
-
对应每个测试案例,需要输出3个整数单独一行,分别表示连续子向量的最大和、该子向量的第一个元素的下标和最后一个元素的下标。若是存在多个子向量,则输出起始元素下标最小的那个。
-
样例输入:
-
3 -1 -3 -2 5 -8 3 2 0 5 8 6 -3 -2 7 -15 1 2 2 0
-
样例输出:
-
-1 0 0 10 1 4 8 0 3
-
/* 剑指Offer - 面试题31: 连续子数组的最大和 (会超时,改成C代码就OK) 九度OJ - 题目1372:最大子向量和(连续子数组的最大和) */ #include <iostream> using namespace std; //#include <stdio.h> //#include <stdlib.h> int FindGreadSumOfSubArray(int *arr, int len); int main(int argc, char* argv[]) { int n; int tmp; int arr[100001]; //while (scanf("%d", &n)) while (cin >> n) { int i = 0; if (n == 0) { break; } else { int len = n; for (int i = 0; i < n; i++) { cin >> tmp; /*scanf("%d", &tmp);*/ arr[i] = tmp; } FindGreadSumOfSubArray(arr, len); } } return 0; } int FindGreadSumOfSubArray(int *arr, int len) { int nCurSum = 0; int nGreatSum = 0x80000000; int begin = 0, end = 0; //最大子数组的开始和结束位置 int greadBegin = 0, greadEnd = 0; for (int i = 0; i < len; i++) { if (nCurSum < 0) { //如果当前子数组的和小于0,重置数组和,开始位置和结束位置 nCurSum = arr[i]; begin = i; end = i; } else { nCurSum += arr[i]; end = i; } if (nCurSum > nGreatSum) { nGreatSum = nCurSum; greadBegin = begin; greadEnd = end; } } cout << nGreatSum << " " << greadBegin << " " << greadEnd << endl; //printf("%d %d %d\n", nGreatSum, greadBegin, greadEnd); return nGreatSum; }