알고리즘 모음(C++)

백준 18111 - 마인크래프트(C++) 본문

백준

백준 18111 - 마인크래프트(C++)

공대생의 잡다한 사전 2021. 11. 6. 00:28

문제 링크입니다. https://www.acmicpc.net/problem/18111

 

18111번: 마인크래프트

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

www.acmicpc.net

브루트포스 알고리즘 문제였습니다.

문제 조건
출력 예시

(0 ~ 256) 높이 사이에서 고르게 만들 수 있는지를 확인하는 문제였습니다.

블록을 쌓던가, 없애던가 총 2가지 방법이 있습니다.

따라서 먼저 해당 높이를 만들 수 있는지를 확인해야합니다.

B + 제거한 블록의 수 >= 쌓아야하는 블록의 수 -> 해당 조건이 맞을때만 시간 계산을 해야합니다.

 

해당 조건을 만족한다면 시간을 계산 해야합니다.

time = 제거한 블록의 수 * 2 + 쌓아야하는 블록의 수

이때 시간의 최솟값이 같다면 높이 중 큰것을 가져와야합니다.

 

문제 접근 방법

1. 높이마다 해당 블록이 몇개가 있는지를 저장한다.

2. 높이를 0 ~ 256 까지 확인한다.

3. 해당 높이에서 쌓을 수 있는지를 확인한다.

4. 쌓을 수 있다면 최소 시간과 최대 높이를 비교한다.

 

 

자세한 것은 코드를 참고해주세요

#define _CRT_SECURE_NO_WARNINGS
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <deque>
#include <stack>

using namespace std;
#define MAX 67000000;

int N, M, B;
int map[501][501];
int less_time = 1000000000;
int high = 0;
vector<pair<int,int>> number_block[257];

void can_make(int cnt) {
	int put_block = 0;
	int take_block = 0;
	int time = 0;
	for (int i = cnt+1; i <= 256; i++) {
		take_block += number_block[i].size() * (i - cnt);
	}
	for (int i = 0; i < cnt; i++) {
		put_block += number_block[i].size() * (cnt - i);
	}
	if (put_block > B + take_block) {
		return;
	}
	time += take_block * 2 + put_block;
	if (less_time >= time) {
		less_time = time;
		high = max(high, cnt);
	}
}

void solve() {
	for (int i = 0; i <= 256; i++) {
		can_make(i);
	}
	cout << less_time << " " << high;
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N >> M >> B;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			cin >> map[i][j];
			number_block[map[i][j]].push_back(make_pair(i, j));
		}
	}
	solve();
	return 0;
}

 

 

질문 및 조언 댓글 남겨주세요

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

백준 1927 - 최소 힙(C++)  (0) 2021.11.10
백준 18870 - 좌표 압축(C++)  (0) 2021.11.10
백준 1966 - 프린터 큐(C++)  (0) 2021.11.05
백준 4949 - 균형잡힌 세상(C++)  (0) 2021.11.03
백준 1436 - 영화감독 숌(C++)  (0) 2021.11.03