南邮 OJ 2045 罗马PK

罗马PK

时间限制(普通/Java) :  1000 MS/ 2000 MS          运行内存限制 : 65536 KByte
总提交 : 202            测试通过 : 51 

比赛描述

一天,机智的罗老师和小马哥想比试以下到底谁更机智,于是他们找到了一个很长的数列串,决定看谁能更快地算出这条长串中子串和的最大值。

这对于身经百战的神牛们通过编程来求解真是小菜一碟,现在想请你帮他们算出正确结果。

eg.长串为(6,-1,5,4,-7),那么子串的最大值为:

6+(-1)+5+4=14




输入

输入的第一行包含一个整数T(1<=T<=20)表示测试用例的数目。接下来有T行输入,每行以一个数N(1<=N<=100000)开头,然后接下来输入N个整数(所有的整数都在-10001000之间)。

输出

对于每个测试用例,你应该输出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

提示

undefined

题目来源

B12040705





#include<iostream>
using namespace std;

int main(){
	long T,N,i,j,a,sum,max_sum,b,begin,end;
	cin>>T;
	for(i=1;i<=T;++i){
		cin>>N;
		sum = 0;
		max_sum = 0;
		b = 1;
		begin = 1;
		end = 1;
		for(j=1;j<=N;++j){
			cin>>a;
			sum += a;
			if(sum<0){
				sum = 0;
				b = j+1;
			}else if(sum>max_sum){
				max_sum = sum;
				begin = b;
				end = j;
			}
		}
		cout<<"Case "<<i<<":"<<endl;
		cout<<max_sum<<" "<<begin<<" "<<end<<endl;
		if(i<T){
			cout<<endl;
		}
	}
}


你可能感兴趣的:(ACM,南邮OJ,罗马PK)