본문 바로가기

알고리즘 문제

[C/C++ 백준 18111번] 마인크래프트 (Silver 3)

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

 

18111번: 마인크래프트

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

www.acmicpc.net

확실히 무슨 카테고리인지 알고 푸냐 아니냐에 따라 문제의 난이도가 매우 다른것 같다.

범위가 무척 큰 것 같아 이분 탐색으로 푸려 했는데, 알고보니 브루트 포스 문제여서 그냥 구현만 하면 되는 문제.

 

#include <cstdio>
#include <algorithm>
using namespace std;
int main(void){
	long long int N, M, B, Block[501][501], mini=64000001, maxi=-1;
	scanf("%lld %lld %lld",&N,&M,&B);
	for(int i=0; i<N; i++){
		for(int j=0; j<M; j++){
			scanf("%lld", &Block[i][j]);
			mini = min(Block[i][j], mini);
			maxi = max(Block[i][j], maxi);
		}
	}
	long long int time, left=mini, right=maxi, save, ans1=99999999999, ans2;
	for(int i=left; i<=right; i++){
		time = 0;
		save = B;
		for(int j=0; j<N; j++){
			for(int k=0; k<M; k++){
				if(Block[j][k]>=i){
					time += 2*(Block[j][k]-i);
					save += (Block[j][k]-i);
				}
				else{
					time += (i - Block[j][k]);
					save -= (i - Block[j][k]);
				}
			}
		}
		if(save >= 0){
			if(ans1>=time){
				ans1 = time;
				ans2 = i;
			}
		}
	}
	printf("%d %d", ans1, ans2);
}