Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

hwooo

BOJ (C/C++) 18111번: 마인크래프트 본문

Study/Algorithm

BOJ (C/C++) 18111번: 마인크래프트

hwooo 2022. 12. 8. 01:06

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

 

18111번: 마인크래프트

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

www.acmicpc.net


풀이

처음엔 이분탐색으로 시도했는데, 게시판의 예제들을 돌리면서 어떤 조건으로 설정해도 모든 경우를 충족시킬 수 없음을 확인함.
또 집터의 범위가 크지 않고, 수의 범위 또한 256으로 작은 편이라 완전 탐색으로 풂. 

코드

#include <stdio.h>
int height[257];
int N, M, B;
void Find(int min, int max) {
	int value = min - 1, high;
	int plus, del, time = 1000000000;

	// 집터의 모든 수를 탐색함
	while (value <= max) {
		value++;
		plus = del = 0;

		for (int i = min; i <= max; i++) {
			if (value - i > 0) plus += (value - i)*height[i];
			else del += (i - value)*height[i];
		}

		// 가지고 있는 블록 갯수보다 많을 때
		if (plus > B + del) continue;

		int t = del * 2 + plus;
		if (t < time) time = t, high = value;
		else if (t == time && high < value) high = value;
	}
	printf("%d %d", time, high);
}

int main() {
	int max = -1, min = 300, n;
	scanf("%d %d %d", &N, &M, &B);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &n);
			height[n]++;
			if (n < min) min = n;
			if (n > max) max = n;
		}
	}
	Find(min, max);
	return 0;
}

'Study > Algorithm' 카테고리의 다른 글

BOJ (C/C++) 1976번: 여행 가자  (0) 2022.12.08
BOJ (C/C++) 13549번: 숨바꼭질 3  (0) 2022.12.08
BOJ (C/C++) 10039번: 평균 점수  (0) 2022.12.06
BOJ (C/C++) 1654번: 랜선 자르기  (0) 2022.12.05
BOJ (C/C++) 15829번: Hashing  (0) 2022.12.05