らての精進日記

修行をします

aoj0516:Maximum Sum

解法

累積和をとって、考えられるN-K+1個の区間をそれぞれO(1)で見ていった。全体でO(N)。

プログラミングを始めたばっかりのころは尺取法で解いたけど、今回はバグへの恐怖からか累積和を使った。

コード

#include<bits/stdc++.h>
using namespace std;

int N,K;
int a[100001];

void solve(){
    for(int i=0;i<N;i++){
        scanf("%d",&a[i+1]);
        a[i+1]+=a[i];
    }
    int ma=0;
    for(int i=K;i<=N;i++)ma=max(ma,a[i]-a[i-K]);
    printf("%d\n",ma);
}
int main(){
    while(scanf("%d%d",&N,&K),N||K)solve();
}