본문 바로가기
코딩/cpp

[백준] 2805번

by 적막한숲 2025. 9. 28.

map + 이진탐색 콤보를 잘 쓰면 쉽게 해결이 가능하다는 것을 알 수 있었다.

범위가 주어졌을 때 사용할 수 있을 듯하다.

#include <iostream>
#include <map>

int main() {
    long n, m, left = 0, right = 0, mid = 0;
    std::cin >> n >> m;
    std::map<long, long> trees; // 높이 -> 개수
    for (int i = 0; i < n; i++) {
        long _height;
        std::cin >> _height;
        trees[_height]++;
        right = std::max(right, _height);
    }

    long total = 0;
    while (left <= right) {
        mid = (left + right) / 2;
        total = 0;
        for (auto& p : trees) {
            if (p.first > mid) {
                total += (p.first - mid) * p.second;
            }
        }
        if (total >= m) {
            left = mid + 1;
        } else {
            right = mid-1;
        }
    }


    std::cout << right;

    return 0;
}

'코딩 > cpp' 카테고리의 다른 글

[백준]11724번  (0) 2025.09.29
[백준] 11279번  (0) 2025.09.29
[백준] 2630번  (0) 2025.09.28
[백준]1927번  (0) 2025.09.28
[백준] 1541번  (0) 2025.09.28