PTA刷题Advanced甲级——1007.Maximum Sequences Sum——Day(4)

问题描述

在这里插入图片描述
题目翻译:
在一串无序的序列中找到加和最大的结果,并且输入这一段加和最大的序列的起始数字和终止数字。如果有很多这样的序列具有同样的加和,我们就取最小的索引为起始数字。如果这串序列全为负,我们就输出sum=0,以及第一个数字和最后一个数字。

题目分析

首先设置一个变量p,指示可能的起始位置。
我们可以设置一个变量temp,在与每个数字加和的过程中,如果temp<0,我们就令temp=0,将起始位置放在当前位置的下一个位置,因为此时显然不可能最大,所以我们把p指向这个位置的下一个位置,先假设从下一位开始能得到最大的加和。如果一直小于0,说明全是负数,我们正好就输出0。
再设一个最大值变量,如果temp>最大值变量,我们就将end设置在此处,说明此时到了这个位置得到了一个最大值。而p则被赋值给我们的起始位置。这样的话,我们就可以控制在查找过程中,p虽然不断改变,但是丝毫不影响真正的起始位置,因为只有出现更大的情况我们才会将真正的起始位置改变。
注意:这里我们要找到的不是起始索引和终止索引,而是array[起始索引]和array[终止索引]

代码

#include<cstdio>
using namespace std;
int a[10001];
int main(void)
{
 int n,i;
 scanf("%d",&n);
 for(i=0;i<n;i++) scanf("%d",&a[i]);
 int tmp=0,res=-1,first=0,end=n-1,p=0; //res初始化为-1
 for(i=0;i<n;i++)
 {
  tmp+=a[i];
  if(tmp<0) 
  {
   tmp=0;
   p=i+1;
  }
  else if(tmp>res)
  {
   res=tmp;
   first=p;
   end=i;
  }
 }
 if(res<0) res=0; 
    printf("%d %d %d",res,a[first],a[end]);
 return 0;
}

答题用时8min
Q7——finish√

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值