题目描述
解题思路:
直接套个大数加法模板即可
(模板看不懂直接背下来也可以)
注意输出格式的规范
代码:
#include<iostream>
#include<cstring>
using namespace std;
int maxn,sum,pos,Begin,End,T,n,a[100005];
int main(){
cin>>T;
for(int Case=1;Case<=T;Case++){
memset(a,0,sizeof a);
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
pos=End=Begin=0; //初始化结果与当前最大值为第一个数
maxn=sum=a[0]; //初始化起始位置与终止位置
for(int i=1;i<n;i++){
if(sum+a[i]<a[i]){ //当前最大值+a[i]反而<a[i],意为当前最大值为负数
sum=a[i]; //故当前最大值可舍去(加上也会是使结果更小),并将a[i]更新为当前最大值
pos=i; //最大值的更新带动起始位置的更新
}
else sum+=a[i];
if(sum>maxn){ //若当前最大值>结果
maxn=sum; //则将结果更新为当前最大值
End=i; //更新终止位置,因为可能不再出现当前最大值>结果的情况
Begin=pos; //更新 结果更新后 对应的起始位置
}
}
if(Case!=T) //因为位置记录的是数组下标,所以输出需要+1
printf("Case %d:\n%d %d %d\n\n",Case,maxn,Begin+1,End+1);
else printf("Case %d:\n%d %d %d\n",Case,maxn,Begin+1,End+1);
}
}