알고리즘/KOALA 알고리즘 스터디

[BOJ/C++] 12847번 꿀 아르바이트

햄스타배 2025. 4. 13. 02:58

https://www.acmicpc.net/problem/12847

이 문제에서 구해야하는건 길이가 n인 배열에서 연속된 m개의 수의 합이 최대가 되는 것을 구하는 것

인덱스 처음부터 m까지의 수의 합을 구하는 방법도 있지만 m이 커질수록 중복된 연산이 많아짐

이때 생각해볼 수 있는게 누적합! 누적합 배열을 하나 만들어 m개의 수의 합을 중복 연산 없이 구하쟈

수가 매우 크므로 long long도 주의..!

#include <iostream>
using namespace std;

int n, m;
long long pay[100000];
long long pay_sum[100000];

int main()
{
    cin >> n >> m;

    for (int i = 0; i < n; i++)
    {
        cin >> pay[i];
    }

    if (m == 0)
    {
        cout << 0;
        return 0;
    }

    pay_sum[0] = pay[0];
    for (int i = 1; i < n; i++)
    {
        pay_sum[i] = pay_sum[i - 1] + pay[i];
    }

    long long max_p = pay_sum[m - 1];

    for (int i = 1; i < n - m + 1; i++)
    {
        long long k = pay_sum[i + m - 1] - pay_sum[i - 1];
        if (max_p < k)
            max_p = k;
    }

    cout << max_p;
}