罗马PK 时间限制(普通/Java) : 1000 MS/ 2000 MS 运行内存限制 : 65536 KByte 总提交 : 126 测试通过 : 24 描述 一天,机智的罗老师和小马哥想比试以下到底谁更机智,于是他们找到了一个很长的数列串,决定看谁能更快地算出这条长串中子串和的最大值。 这对于身经百战的神牛们通过编程来求解真是小菜一碟,现在想请你帮他们算出正确结果。 eg.长串为(6,-1,5,4,-7),那么子串的最大值为: 6+(-1)+5+4=14 输入 输入的第一行包含一个整数T(1<=T<=20)表示测试用例的数目。接下来有T行输入,每行以一个数N(1<=N<=100000)开头,然后接下来输入N个整数(所有的整数都在-1000到1000之间)。 输出 对于每个测试用例,你应该输出2行。第一行是 "Case #:",#表示测试用例数。第二行包含3个整数,子串和的最大值,对应字串的开始位置,对应字串的结束位置。如果有超过一个的答案,输出第一个。每两个测试用例之间有一个空白行。 样例输入 2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5 样例输出 Case 1: 14 1 4 Case 2: 7 1 6 #include <iostream> #include <cstdio> using namespace std; int start,End; int Maxsum_location(int *arr, int size) { int maxSum = -101; int sum = 0; int curstart = start = 1; /* curstart记录每次当前起始位置 */ for(int i = 1; i <= size; i++) { if(sum < 0) { sum = arr[i]; curstart = i; /* 记录当前的起始位置 */ }else { sum += arr[i]; } if(sum > maxSum) { maxSum = sum; start = curstart; /* 记录并更新最大子数组起始位置 */ End = i; } } return maxSum; } int main() { int k=0,n,m; int a[100]; cin>>n; bool first=true; while(n--) { cin>>m; for(int i=1;i<=m;i++) { cin>>a[i]; } if(first) { first=false; } else { cout<<endl; } printf("Case %d:\n",++k); cout<<Maxsum_location(a,m); cout<<" "<<start<<" "<<End<<endl; } return 0; }