Problem Solving/백준
[18111] 마인크래프트
충무로술겜마
2021. 7. 7. 14:54
https://www.acmicpc.net/problem/18111
18111번: 마인크래프트
팀 레드시프트는 대회 준비를 하다가 지루해져서 샌드박스 게임인 ‘마인크래프트’를 켰다. 마인크래프트는 1 × 1 × 1(세로, 가로, 높이) 크기의 블록들로 이루어진 3차원 세계에서 자유롭게
www.acmicpc.net
모든 좌표 더한 값 + 가지고 있는 블록 개수를 가로*세로 로 나눠서 평균을 내보면 그 값보다 높은 높이의 값을 결과값으로 가질 수 없기 때문에 이를 바탕으로 조금 더 효율적으로 계산할 수 있습니다.
그리고 제발... 버퍼드리더를 생활화합시다... 저는 바보였어요
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
import java.io.BufferedReader
import java.io.InputStreamReader
import java.lang.StringBuilder
import java.util.*
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val (n, m, b) = br.readLine().split(" ").map { it.toInt() }
var minTime = Int.MAX_VALUE
var minTimeHeight = 0
var sum:Long = 0
val arr = Array<Array<Int>>(n) { Array<Int>(m) { 0 } }
// 좌표 값 입력
for(i in 0 until n){
val st = StringTokenizer(br.readLine(), " ")
for(j in 0 until m){
arr[i][j] = Integer.parseInt(st.nextToken())
sum += arr[i][j]
}
}
val average:Long = (sum+b)/(n*m)
maxHeight = if (average>256)256 else average.toInt()
for(targetHeight in 0..maxHeight){
var time = 0
for(l in 0 until n){
for(z in 0 until m){
if (arr[l][z] > targetHeight){
time += (arr[l][z] - targetHeight) * 2
}else if (arr[l][z] < targetHeight){
time += targetHeight-arr[l][z]
}
}
}
if(minTime >= time){
minTime = time
minTimeHeight = targetHeight
}
}
val sb = StringBuilder()
sb.append("$minTime").append(" $minTimeHeight")
print(sb)
}
|
cs |