前缀和练习-最小和

来源:互联网 发布:互联网软件与服务 编辑:程序博客网 时间:2024/05/16 14:27
我们先看看题目:

        这道题第一眼看,我们就会自然想到以下的的方法:

       用双重循环,用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;} 

0 0
原创粉丝点击