问题:
现在给你 n 个整数 a1,a2,…,an。 请问其中子段长度(子段中数字个数)大于等于 m 的最大子段和是多少? 子段指的是数组中连续的一段数字,这些数字的和被称为子段和。
输入格式
第一行两个整数 n,m。
接下来一行 n 个整数,a1,a2,…,an。
输出格式
输出一行一个数表示答案。
思路:先用一个a数组来存储n个整数,然后对a数组做一次前缀和,把数值存储到s数组,然后在用一个t数组来存储第i个坐标目前的最小值,最后在用一个循环比较ans(ans是最终答案,初始值是-100000000000,类型是long long)和s[i]-t[i - m]的最大值,比较结果存储到ans变量,最后输出ans
实现代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
long long s[100001],a[100001],t[100001];
int main(){
scanf ("%d%d",&n,&m);
for (int i = 1;i <= n;i++){
scanf ("%lld",&a[i]);
}
s[0] = 0;
for (int i = 1;i <= n;i++){
s[i] = s[i - 1] + a[i];
}
t[0] = 0;
for (int i = 1;i <= n;i++){
t[i] = min(t[i - 1],s[i]);
}
long long ans = -100000000000;
for (int i = m;i <= n;i++){
ans = max(s[i] - t[i - m],ans);
}
printf ("%lld",ans);
return 0;
}