쌓고 쌓다

[백준] 마인크래프트 18111번 C++ 풀이 본문

알고리즘/백준

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

승민아 2021. 12. 18. 17:17

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

 

18111번: 마인크래프트

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

www.acmicpc.net

모든 높이 ( 0~256 )에 대해 브루트 포스를 진행해도 정답은 처리가 되는 거 같습니다.

입력받은 최소높이~최대높이에 대해 땅 고르기 작업을 진행해서 최소 시간과 높이를 구하면 됩니다.

먼저 solve함수에서 만들 높이에 대해 높은 땅을 먼저 깎아주고 깎은 블럭 개수만큼 인벤토리에 담고, 시간을 더해줍니다.

그리고 높이에 대해 낮은 땅들을 올려주는 작업을 해주면 됩니다.

이에 남은 블럭이 0 이상이면 최소 시간을 초기화시켜주고 최소 시간이라면 최대 높이를 찾아줍니다.

#include <iostream>
#include <algorithm>
using namespace std;
int N, M, B;
int arr[500][500];
int low = 999, high = -1;
int Time=987654321, hres=-1;
void solve(int h,int b)
{
	int ptime = 0;

	for(int i=0;i<N;i++)
		for (int j = 0; j < M; j++)
		{
			if (arr[i][j] > h)
			{
				b += arr[i][j] - h;
				ptime += 2* (arr[i][j] - h);
			}
		}

	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
		{
			if (arr[i][j] < h)
			{
				b -= h- arr[i][j];
				ptime += 1 * (h- arr[i][j]);
			}
		}
        
	if (b >= 0)
	{
		Time = min(Time, ptime);
		if(Time==ptime)
			hres = max(hres, h);
	}

}
int main(void)
{
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	cin >> N >> M >> B;
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
		{
			cin >> arr[i][j];
			low = min(low, arr[i][j]);
			high = max(high, arr[i][j]);
		}
	for (int i = low; i <= high; i++)
		solve(i, B);
	cout << Time << " " << hres;
}

 

Comments