1 minute read

문제 접근

석순과 종유석의 누적합 배열을 만듭니다.
그리고 h가 7, 그리고 개똥벌레가 나는 높이가 1일때 부수는 수는 다음과 같습니다.

석순 전체 합 + 종유석 높이가 7이상인수

왜냐하면 1일때는 석순 전체를 부수고 종유석에서는 종유석의 높이가 7이라면 부서지겠죠 6이하라면 부서지지 않고요.

코드

#include <bits/stdc++.h> 
#define ll long long
using namespace std;
int n, h;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    // 입력 받기
    cin >> n >> h;
    vector<int> ob(n);
    for (int i = 0; i < n; i++)
        cin >> ob[i];
    
    // 상하 구분을 위한 배열 초기화
    vector<int> up(h + 1, 0);
    vector<int> lo(h + 1, 0);
    
    // 상하 구분
    for (int i = 0; i < n; i++)
    {
        if (i & 1)
            up[ob[i]]++;
        else
            lo[ob[i]]++;
    }
    
    // 누적합 계산
    for (int i = 1; i <= h; i++)
    {
        up[i] = up[i] + up[i - 1];
        lo[i] = lo[i] + lo[i - 1];
    }
    
    int ans = 2000002, cnt = 1;
    
    // 답 구하기
    for (int i = 1; i <= h; i++)
    {
        int tmp = lo[h] - lo[i - 1];
        tmp += up[h] - up[h - i];
        
        if (tmp < ans)
        {
            ans = tmp;
            cnt = 1;
        }
        else if (tmp == ans)
            cnt++;
    }
    
    // 결과 출력
    cout << ans << " " << cnt;
    
    return 0;
}

Leave a comment