小白一枚,想开始写写东西,所以质量方面可能不会很好,随意看看就行,有问题什么的都是可以说的
或者对于我的方法不太懂得可以找我聊聊QQ1282573995,也可以来找我一起来或者有人愿意带我的这枚小白的
也很是欢迎的(掌声)~~~
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1003
大致题意:第一个数是测试组数,第二行就是:第一个数字N表示数字的个数,之后就是N个数字
求得这N个数字的中连续和的最大值,并把启终下标输出出来
代码如下:
#include<stdio.h>
int n,t,N,qu[101000];
//first起始,end结尾,ans最大和
int first,end,ans,sum,tf;
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&qu[i]);
ans=end=sum=first=tf=0;
int flag=0;
//看查是否全部是负数,如果全都是负数的话,直接找最大的一个负数即可
for(int i=0;i<n;i++){
if(qu[i]>=0)
{
flag=1;
break;
}
}
if(flag==0)//全是负数的情况
{
ans=-999999999;
for(int i=0;i<n;i++)
{
if(qu[i]>ans)
{
ans=qu[i];
first=end=i;
}
}
}
else//不全为负数的情况
{
for(int i=0;i<n;i++){
sum+=qu[i];//用来存和值
if(sum>ans)//存下最大和值,每次得到最大和值之后,
{ //就把这个这个下标存下来,此时这个下标就是终点
ans=sum;
end=i;
}
if(sum<0) //要最大和值,所以当sum<0时就应该把前面的都抛弃了,并清零
{ //tf是用来存储当前清零后的一个起始,因为每次清零了之后就要重新开始了
sum=0; //但这个tf不一定就是答案要的起始,因为虽然清零了,但是之后的和值
tf=i+1; //不一定能超过前面的最大和值,所以只能作为可能起始,存下来
}
if(tf<=end)//当终点的下标大于等于tf就说明,出现了一个以tf为起始的最大和值
{ //那么此时就可以把tf作为起始
first=tf;
}
}
}
printf("Case %d:\n",++N);
if(t!=0)//注意最后一组不要空行
printf("%d %d %d\n\n",ans,first+1,end+1);
else
printf("%d %d %d\n",ans,first+1,end+1);
}
return 0;
}