这题需要考虑很多不同的情况
曾经写过一个不用任何数组的AC版本 现在拿出来WA了 可见测试数据更新过
今天按原来的思路 加了个数组写了新版本AC了
数组s用来保存可能出现最大和的值 还要考虑其负值的可能性 加了之后便于找b(begin)
注意输出的坐标是首个出现的符合条件的串 就是要抓住所有前缀0 放弃所有后缀0 前缀0可能是若干正数开头的和为0的整数
以下代码若干步骤有多重考虑 复杂度仍控制在O(n)
#include<stdio.h>
int b,e,i,k,t,n,a,s[100001],m;
int main(){
for(scanf("%d",&t),k=1;k<=t;++k){
for(scanf("%d%d",&n,&a),m=s[0]=a,e=0,i=1;i<n;++i){
scanf("%d",&a);
if(s[i-1]>=0&&s[i-1]+a>=0)s[i]=s[i-1]+a;
else s[i]=a;//s[i-1]<0时 无论a(可看作a[i])值多少 s[i]=a都合理 而且s再加上之前的和不可能成为最大值
if(s[i]>m)m=s[i],e=i;//若出现多个最大值 end始终在第一个
}
for(i=e;i>=0;--i)
if(s[i]<0)break;//若找不到s<0,任何情况都b=0
b=m>=0?i+1:i,e++,b++;//being和end自增后可直接输出 m<0必有b=e
printf("Case %d:\n%d %d %d\n%s",k,m,b,e,k<t?"\n":"");
}
}