问题描述
题目翻译:
在一串无序的序列中找到加和最大的结果,并且输入这一段加和最大的序列的起始数字和终止数字。如果有很多这样的序列具有同样的加和,我们就取最小的索引为起始数字。如果这串序列全为负,我们就输出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√