题目描述
给你一个数列a1,a2,...,an,求m个连续数字组成的子段和最大值。
输入
有多个样例,每个样例的第一行是两个整数n和m,(1≤m≤n;≤100,000)。如果n和m为0表示输入结束,这个样例不需要处理。第二行是n个整数ai,0≤ai≤10000。
输出
每行输出一个整数,即样例的结果。
样例输入
6 3 1 2 3 4 5 6 6 3 1 2 3 3 2 1 0 0
样例输出
15 8
解题思路: 前缀和 (之前的博客解释过了,听起来高大上,实际上就是个弟中之弟)
AC代码:
cpp
#include <stdio.h>
int main()
{
int n,m,t,ans;
while (scanf("%d %d",&n,&m) != EOF && !(n==0 && m==0))
{
int nums[100010] = {0};
for (int i = 1; i <= n; i ++)
{
scanf("%d",&nums[i]);
nums[i] += nums[i-1]; // 前缀和
}
ans = nums[m];
for (int i = m+1; i <= n; i ++)
{
t = nums[i]-nums[i-m];
if (t > ans)
ans = t;
}
printf("%d\n",ans);
}
return 0;
}