https://www.acmicpc.net/problem/18111
18111번: 마인크래프트
팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게
www.acmicpc.net
처음에 입력이 고른 땅인 경우를 생각 안 해서 틀렸었다
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int[][] arr = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
///////////////////////////////////////////////////////////////
// index = 높이
// 해당 높이로 만들었을 경우 걸리는 시간을 모두 저장하자
// 0초 걸리고 평탄화도 가능하므로 -1로 초기화 해주기
int[] answer = new int[257];
for (int i = 0; i <= 256; i++)
answer[i] = -1;
// 바보같이 땅의 최저 높이보다 더 파내서 시간이 더 걸려?
int min_height = Integer.MAX_VALUE;
// 바보같이 땅의 최고 높이보다 더 붙여서 시간이 더 걸려?
int max_height = Integer.MIN_VALUE;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
min_height = Math.min(min_height, arr[i][j]);
max_height = Math.max(max_height, arr[i][j]);
}
}
for (int height = min_height; height <= max_height; height++) {
// 각 높이에 쓸 인벤토리 벽돌
int tmp_B = B;
int time = 0;
// 땅 먼저 파거나 채워넣는 건 순서 별로 상관 없다
// 땅 파
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] > height) {
tmp_B = tmp_B + (arr[i][j] - height);
time = time + 2 * (arr[i][j] - height);
}
}
}
// 땅 채워넣어
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] < height) {
tmp_B = tmp_B - (height - arr[i][j]);
time = time + 1 * (height - arr[i][j]);
}
}
}
// 해당 높이로 맞추는 작업을 했는데 벽돌이 부족했네
// 그럼 그 높이는 못 맞추는거지
if (tmp_B >= 0) {
answer[height] = time;
}
}
int height = -1;
int time = Integer.MAX_VALUE;
for (int i = 0; i <= 256; i++) {
if (answer[i] != -1 && answer[i] <= time) {
height = i;
time = answer[i];
}
}
System.out.println(time + " " + height);
}
}