창고 다각형 - 2304

2025. 2. 12. 15:42PS/백준

문제

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

느낀점

내려갔다가 올라오는 경우를 없애려면 가장 높은 곳을 중심으로 내려가도록만 설계해야한다. 성공 조건을 생각해내는 것이 상당히 어려웠던 문제

풀이

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

int main()
{
    int N, start, height;
    int maxHeight = 0, maxIndex = 0, curHeight, curStart;
    long answer = 0;

    std::pair<int, int> temp;
    std::vector<std::pair<int, int>> factory;
    std::cin >> N;
    for (int i = 0; i < N; i++)
    {
        std::cin >> start >> height;
        temp = std::make_pair(start, height);
        factory.push_back(temp);
        if (height > maxHeight)
        {
            maxHeight = height;
        }
    }
    std::sort(factory.begin(), factory.end(), [](const std::pair<int, int> &a, const std::pair<int, int> &b)
              { return a.first < b.first; });

    curStart = factory[0].first;
    curHeight = factory[0].second;

    for (int i = 1; i < N; i++)
    {
        if (factory[i].second >= curHeight)
        {
            answer += curHeight * (factory[i].first - curStart);
            curStart = factory[i].first;
            curHeight = factory[i].second;
        }

        if (factory[i].second == maxHeight)
        {
            maxIndex = i;
            break;
        }
    }

    curStart = factory[N - 1].first;
    curHeight = factory[N - 1].second;

    for (int i = N - 2; i >= maxIndex; i--)
    {
        if (factory[i].second >= curHeight)
        {
            answer += abs(curHeight * (factory[i].first - curStart));
            curStart = factory[i].first;
            curHeight = factory[i].second;
        }
    }
    answer += maxHeight;
    std::cout << answer;

    return 0;
}

'PS > 백준' 카테고리의 다른 글

한 줄로 서기 - 1138  (0) 2025.02.12
미로 만들기 - 1347  (0) 2025.02.12
참외밭 - 2477  (0) 2025.02.12
결혼식 - 5567  (0) 2025.02.12
점프 점프 - 11060  (0) 2025.02.12