问题描述 给定序列a [1],a [2],a [3] ...... a [n],你的工作是计算子序列的最大和。例如,给定(6,-1,5,4,-7),该序列中的最大和是6 +( - 1)+ 5 + 4 = 14。
|
输入 输入的第一行包含整数T(1 <= T <= 20),表示测试用例的数量。然后是T行,每行以数字N(1 <= N <= 100000)开始,然后是N个整数(所有整数都在-1000和1000之间)。
|
产量 对于每个测试用例,您应输出两行。第一行是“Case#:”,#表示测试用例的编号。第二行包含三个整数,序列中的Max Sum,子序列的起始位置,子序列的结束位置。如果有多个结果,则输出第一个结果。在两个案例之间输出一个空行。
|
样本输入 2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
|
样本输出 案例 1:14 1 4 案例2: 7 1 6 |
#include<iostream>
using namespace std;
int data[100000+5];
int start,end1;
int T;
int step=1;
int main()
{
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>data[i];
int max=-1e6;
int k=1;
int sum=0;
for(int i=0;i<n;i++)
{
sum+=data[i];
if(sum>max)
{
max=sum;
start=k;
end1=i+1;
}
if(sum<0)
{
sum=0;
k=i+1;
}
}
if(step!=1)
cout<<endl;
cout<<"Case "<<step<<":"<<endl;
cout<<max<<" "<<start<<" "<<end1<<endl;
step++;
}
return 0;
}