본문 바로가기
코딩/cpp

[백준] 18111번

by 적막한숲 2025. 10. 1.

문제에서 조건을 잘봐야할 듯하다.

0~255라는 부분이 가장 큰 핵심 중 하나고, 블럭 수가 두번째 key다.

블럭 수가 key인 이유는 block이 -에서 +로 변하는 시점에서 나온 값이 최소 값이 나타나는 시점으로 볼 수 있기 때문이다.

그 전까지는 계속 base height를 줄여 나가면서 해결해야 한다.

#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <climits>

int main() {
    int n, m, b;
    std::cin >> n >> m >> b;
    std::vector<int>height(n*m);
    std::set<int> base;
    std::map<int, bool> visited;
    int minH = INT_MAX;
    int maxH = 0;
    for (int i = 0; i < n*m; i++) {
        std::cin >> height[i];
        base.insert(height[i]);
        if (height[i] < minH) {
            minH = height[i];
        }
        if (height[i] > maxH) {
            maxH = height[i];
        }
    }
    int time = INT_MAX, h = 0;
    for (int _h : base) {
        for (int i = _h; i >= minH; i--) {
            int _time = 0; int _b = b;
            if (visited[i]) {
                continue;
            }
            for (int j = 0; j < n*m; j++) {
                if (height[j] > i) {
                    _time += 2*(height[j] - i);
                    _b += (height[j] - i);
                } else if (height[j] < i) {
                    _time += (i - height[j]);
                    _b -= (i - height[j]);
                }
            }
            visited[i] = true;
            if (_time < time && _b >= 0) {
                time = _time;
                h = i;
            } else if (_time == time && _b >= 0 && h < i) {
                h = i;
            }
        }
    }

    std::cout << time << " " << h << std::endl;
    return 0;
}

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

[백준] 21736번  (0) 2025.10.02
[백준] 18870번  (0) 2025.10.01
[nginx] 설치 법 및 설정 법  (0) 2025.09.30
[nginx] 초심자 가이드  (0) 2025.09.30
[nginx/포트폴리오 프로젝트] proxy_pass란 무엇인가  (0) 2025.09.30