共三道,前两道就是前面的例题,这里记录第三道:

同样是求最大子列和,输出最大和和子列的首末元素。

如果出现相等的子列,输出i,j最小的;如果全是负数,输出0和数列的首末元素。

判断是否全负,是否元素总数为1,剩下的按照常规运算。

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int K=100000;
 5 int main(){
 6     int n,num=0,temp=0;
 7     scanf("%d",&n);
 8     int a[K],f=0,l=0;
 9     for(int i=0;i<n;i++){
10         scanf("%d",&a[i]);
if(a[i]<0) temp++;
11 }15 int thissum=0,maxsum=a[0]; 16 if(temp==n){ 17 printf("0 %d %dn",a[0],a[n-1]); 18 } 19 else if(n==1){ 20 printf("%d %d %dn", a[0],a[0],a[0]); 21 }else{ 22 for(int i=0;i<n;i++){ 23 thissum+=a[i]; 24 if(thissum>maxsum){//只有thissum>maxsum时更新l,f,保证l和f指向第一组最大值 25 maxsum=thissum; 26 l=a[i]; 27 num++; 28 f=a[i-num+1]; 29 } 30 else if(thissum<=maxsum&&thissum>=0){ 31 num++; 32 } 33 else if(thissum<0){ 34 thissum=0; 35 num=0; 36 } 37 } 38 printf("%d %d %dn",maxsum,f,l); 39 } 40 return 0; 41 }

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!