题目描述
给出一段序列,选出其中连续且非空的一段使得这段和最大。
输入格式
第一行是一个正整数NN,表示了序列的长度。
第二行包含NN个绝对值不大于10000整数Ai,描述了这段序列。
输出格式
一个整数,为最大的子段和是多少。子段的最小长度为11。
输入 #1
7
2 -4 3 -1 2 -4 3
输出
4
法1
有位dalao写了一个超级短的代码就AC了哈哈哈
原链接(https://www.luogu.org/blog/RobertLYY/solution-p1115)
根据这个思路写的代码
每次循环输入数据num的时候,先判断sum与0的大小,在加上num,用maxn来保存循环过程中的最大值。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int num,maxn,sum=0;
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> num;
if (i == 0)
maxn = num;
if (sum < 0) //要注意的是sum是负数的情况要放在加num之前,
sum = 0; //如果输入的序列全部是负数的时候,maxn就不会是0
sum += num;
if (sum > maxn)
maxn = sum;
}
cout << maxn;
system("pause");
return 0;
}
原题链接
dalao题解链接
求每段和的最大值的最小值,利用二分的思想,首先确定答案范围,最小是这N个数中的最大值(边界取自此最大值单独一段,不跟左右结合),最大边界是全部数之和,最终答案一定在这个范围内。
我的代码