HDU 1002

题目描述

在这里插入图片描述

解题思路:

直接套个大数加法模板即可
(模板看不懂直接背下来也可以)
注意输出格式的规范



代码:

#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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wiz1code(算法号)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值