题目地址:
http://www.patest.cn/contests/mooc-ds2015spring/01-2
此题为最大子列和的加强版。需要记录最大和以及首项和尾项。
最大子列和的算法:
//注意如果最大和小于零则输出零,所以maxsum需初始化为零
for(i=0;i<N;i++){
//在线加和
sum+=data[i];
if(sum>maxsum)
//更新
maxsum=sum;
else if(sum<0)
//如果sum<0,sum不肯使后面部分和增大,故初始化为零。
sum=0;
}
只要将上述算法增加一些内容即可
以下为AC代码.
#include<stdio.h>
int main(){
int a[10000],K;
int i;
while(scanf("%d",&K)!=EOF){
for(i=0;i<K;i++){
scanf("%d",&a[i]);
}
//test 中文
//mstart是最大值初始值,mend最大值尾值。
int sum=0,maxsum=0,mstart,mend,start;
//allneg标记数据是否全部为负数,
//startchange标记start是否要变化
bool allneg=true,startchange=true;
//change标记maxsum是否更新过。
bool change=false;
for(i=0;i<K;i++){
if(a[i]>=0){
allneg=false;
}
if(startchange){
start=a[i];
startchange=false;
}
sum+=a[i];
if(sum>maxsum){
maxsum=sum;
mstart=start;
mend=a[i];
change=true;
}
//注意这一步,是防止全部数据除了几个零都是负数的情况!
else if(change==false && sum==maxsum){
maxsum=sum;
mstart=start;
mend=a[i];
change=true;
}
else if(sum<0){
//sum<0,start要更新
startchange=true;
sum=0;
}
}
if(allneg){
printf("%d %d %d\n",0,a[0],a[K-1]);
}
else{
printf("%d %d %d\n",maxsum,mstart,mend);
}
}
return 0;
}