백준/C++

[백준][C++] 18111번 - 마인크래프트

Campus Coder 2023. 7. 10. 17:51
728x90
반응형

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

 

18111번: 마인크래프트

팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게

www.acmicpc.net


풀이

  1. 모든 땅의 높이만 같으면 되므로 N*M 크기의 땅을 선형변환 -> a[N*M]
  2. 모든 땅의 높이 중 최고 높이과 최저 높이 사이의 값이 땅을 고르는 높이가 될 수 있음
  3. 땅을 고르게 될 높이별로 땅을 고르는 시간 측정 -> 최솟 값 저장
  4. 이때 고르는 작업에 의한 인벤토리의 블록 개수 측정
    -> 음수라면 불가능한 작업이므로 시간 측정 배제
    -> 이때 작은 수에서 큰 수로 땅의 높이를 증가하면서 검사한다면, 작업 종료 후 인벤토리의 값이 음수가 되었을 때, 더 높은 높이의 땅들도 마찬가지로 블록이 부족하므로 작업이 불가능함 -> 반복문 종료(시간 단축)

#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;

int main()
{
    int N, M, B;
    cin >> N >> M >> B;
    N = N * M;
    int a[N];
    for (int i = 0; i < N; i++)
    {
        cin >> a[i];
    }
    sort(a, a + N);
    int time = INT_MAX, high;
    for (int h = a[0]; h <= a[N - 1]; h++)
    {
        int t = 0;
        int block = B;
        for (int i = 0; i < N; i++)
        {
            if (h > a[i])
            {
                block += a[i] - h;
                t += h - a[i];
            }
            else if (h < a[i])
            {
                block += a[i] - h;
                t += 2 * (a[i] - h);
            }
        }
        if (block < 0)
            break;
        if (t <= time)
        {
            time = t;
            high = h;
        }
    }
    cout << time << " " << high;
}
728x90
반응형

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

[백준][C++] 11659번 - 구간 합 구하기 4  (0) 2023.04.26
[백준][C++] 11727번 - 2×n 타일링 2  (0) 2023.04.17