HDU 1003 Max Sum

小白一枚,想开始写写东西,所以质量方面可能不会很好,随意看看就行,有问题什么的都是可以说的

或者对于我的方法不太懂得可以找我聊聊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;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值