我们先看看题目:

这道题第一眼看,我们就会自然想到以下的的方法:
用双重循环,用i来表示开始数,j表示结束的数,再通过一个数组来保存由i到j之间数的和,如:10 4 1,输入时的数组a[i]~a[j]之间的数相加,当i从1开始循环,j从m开始循环。循环比较到n-m+1,最后得出最小的和。这种方法也叫窗口。
红框的就是一个窗口,而求它们的和就像窗口一样往下滑
但是这种方法我最后还是没有采纳,所以我们有新的方法,叫前缀和。
前缀和,就是指一个数和前面所有数的和。
那么这道题怎么用前缀和呢?
首先,把数输入到一个a数组里,用一个f数组来保存它们的前缀和,也就是f[i]=ff[i-1]+a[i](a数组和f数组下标为1开始,不能下标为0)。然后就可以用一个变量保存累加三个数f数组里的数减去下标为0时的数,也就是保存它们的部分和,最后通过比较大小,就能求出最小和了。。。
以下是代码:
#include<iostream>
#include<cstdio>
using namespace std;
int a[1000000],f[1000000];
int main()
{
freopen("1497.in","r",stdin);
freopen("1497.out","w",stdout);
int n,m,s;
long long k=100000000;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
f[i]=f[i-1]+a[i];
}
for(int i=0;i<=n-m;i++)
{
s=f[m+i]-f[i];
if(s<k)
k=s;
}
cout<<k;
return 0;
}