很基础的一道最大连续子序列,前面已经有过一道 相似的题,这道题就是在那上面增加了一点难度而已,要求最大连续子序列的首尾元素,只要用一个计数器就可以搞定了,你要记住,第一个元素在增长的请款下记录,最后一个情况在增长的情况下变化或是更新。
还有意见比较麻烦的事情就是后面有一个所有的都是0的判断(这个相对简单)只是后面的-1 0 -2这种情况有点麻烦。
对于首元素我们要做的就是在每次总和变化的时候改变,(这里的总和是指前一个序列和后一个序列比较,并且两者不是包含的关系),这时候只需要用一种设置器来辨别一下就可以了。
下面是一个工参考的代码
#include<iostream> #include<string> using namespace std; int main() { int a[10005];//b[100]; int N,i,k,j,s,sum,leap,n,m,t; while(scanf("%d",&N)!=EOF&&N) { leap=0; //这里的leap就是设置的设置器用来辨别是否总的和有改变 m=0; sum=-1; //之所以设置sum=-1,是因为上面-1 0 -2这种情况们这是很烦人的 s=0; n=0; k=j=0; for(i=0;i<N;i++) cin>>a[i]; for(i=0;i<N;i++) { s+=a[i]; if(s<0) { s=0; leap=0; continue; } else { if(leap==0) { k=i; //k是记录首元素的,她是可以变化的,随着总和的变化,但是不管变大或是变小,他都会变化 leap=1; } if(s>sum) { t=k; //居于上述的k的值的工能的不完善用t来弥补不足 j=i; //j用来记录最后的元素 sum=s; } } } for(i=0;i<N;i++) { if(a[i]<0) n=0; else { n=1; break; } } if(n==0) { sum=0; cout<<sum<<" "<<a[0]<<" "<<a[N-1]<<endl; } else { cout<<sum<<" "<<a[t]<<" "<<a[j]<<endl; } } return 0; }