题意:给出n个数,求最大连续的子区间和,并且输出该区间的第一个和最后一个数。
如果所有数都小于0,那么则输出0,第一个数和最后一个数。
看数据k的范围,就知道肯定不能两层for循环来求区间和,O(n^2)的复杂度肯定超时
所以这里肯定要求一遍for循环就能知道结果
定义区间l和r,sum为目前[l,r]之间的和
一开始l=r=0,sum=a[0]
接下来,对于当前第i个数字a[i]
如果sum+a[i]>a[i],那么就将a[i]一起加入到区间中去。
如果sum+a[i]<a[i],那么还不如不加,直接重新从a[i]开始,sum=a[i]。
更新对应的区间,顺便比较一下当前的sum和maxsum即可
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string.h> #define INF 0x3f3f3f3f using namespace std; const int maxn=10000+5; int a[maxn]; int maxsum=-INF; int maxl,maxr; int l,r; int main() { int n,val; int sum; scanf("%d",&n); scanf("%d",&a[0]); sum=a[0]; l=0; r=0; maxl=l; maxr=r; maxsum=sum; bool allnegative=true; if(a[0]>=0) allnegative=false; for(int i=1;i<n;i++){ scanf("%d",&a[i]); if(a[i]>=0) allnegative=false; //printf("l:%d r:%d sum:%d %d:val\n",l,r,sum,a[i]); if(sum+a[i]>a[i]){ sum+=a[i]; r++; if(sum>maxsum){ maxl=l; maxr=r; maxsum=sum; } } else{ sum=a[i]; l=r=i; if(sum>maxsum){ maxl=l; maxr=r; maxsum=sum; } } } //如果都小于0,按照题目要求,输出0,第一个和最后一个数 if(allnegative) printf("0 %d %d\n",a[0],a[n-1]); else printf("%d %d %d",maxsum,a[maxl],a[maxr]); return 0; }
时间: 2024-10-12 08:56:45