2019E1_B 前缀和

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44024733/article/details/102752505

B 前缀和

题目

知识点

前缀和是一种较为常见的预处理方式,能大大降低查询的时间复杂度。我们可以简单理解为“数列的前 n 项的和”。

对于一个给定的序列A,其前缀和S的定义如下:

S [ i ] = j = 1 i A [ j ] S[i]=\sum_{j=1}^{i}A[j]

预处理出来前缀和序列S后我们就可以 O ( 1 ) O(1) 的查询区间和

s u m ( l , r ) = S [ r ] S [ l 1 ] sum(l,r)=S[r]−S[l−1]

练习题

给定一个长度为n的整数序列A,问连续k个整数的和的最大值。

输入

第一行两个正整数 n , k , ( 0 < n < 1 0 6 , 0 < k < n ) n,k,(0<n<10^{6},0<k<n)

第二行 n n 个整数,表示序列 A ( 1 0 6 < A i < 1 0 6 ) A,(−10^{6}<A_{i}<10^{6})

输出

一行一个整数

输入样例

5 3 
2 5 -4 10 3

输出样例

11

思路

预处理一下前缀和,然后遍历一遍求最大值

代码

#include <algorithm>
#include <iostream>

using namespace std;
typedef long long ll;
const int ms = 1e6 + 10;
ll sum[ms];

inline void init_cin()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

int main()
{
    init_cin();
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; ++i)
    {
        cin >> sum[i];
        sum[i] += sum[i - 1];
    }
    ll res = sum[k];
    for (int i = 2; i + k - 1 <= n; ++i)
    {
        res = max(res, sum[i + k - 1] - sum[i - 1]);
    }
    cout << res << "\n";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44024733/article/details/102752505