题目
给出一段序列,选出其中连续且非空的一段使得这段和最大。
分析
一开始肯定会想到二重循环
for (int i=1;i<=n;i++)
for (int j=i;j<=n;j++)求和,求最大值
人之常情
不过
n
≤
200000
n\leq 200000
n≤200000
只能用一重循环。
首先这些数可能是负数。
所以初始化为-10001是可以的
然后如果变成了负数等于删除该段。否则求最大值
代码如下
#include <cstdio>
using namespace std;
int max(int x,int y){
return (x>y)?x:y;
}
int main(){
int s,x,ans=-2147483648,i,n;
scanf("%d",&n);
scanf("%d",&s);
for (i=2;i<=n;i++){
scanf("%d",&x);
s+=x;
ans=max(ans,s);
if (s<0) s=0;
}
printf("%d",ans);
return 0;
}