Algorithm/acmicpc.net

아이디어 is null.. (실버2)

winney916 2022. 2. 25. 21:41
728x90

#18111번 마인크래프트 https://www.acmicpc.net/problem/18111

 

18111번: 마인크래프트

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

www.acmicpc.net

어떻게 구현해야하는지 떠오르지않아서 다른 자료들을 조금 참고했다.

 

브루트포스로 구현해야하는데, 탐색 높이의 범위를 설정하는 방법이 헷갈렸다.

탐색범위는 주어진 높이 중 최소높이부터 최대높이까지 진행하면 된다.

 

시간초과로 머리아팠지만 pypy3제출로 해결

파이썬으로 그리디 혹은 브루트포스를 제출하는건 늘 시간초과가 나는듯 하다.

 

from sys import stdin
input = stdin.readline
N, M, B = map(int, input().split())
maps = []
# 최솟값 초깃값은 가능한 수 중 가장 큰 값으로
# 최댓값 초깃값음 가능한 수 중 가장 작은값으로
minimum = 256
maximum = 0
# 입력을 받으면서 최솟값 최댓갑 설정
for _ in range(N):
    tmp = []
    for num in input().split():
        num = int(num)
        if num > maximum:
            maximum = num
        elif num < minimum:
            minimum = num
        tmp.append(num)
    maps.append(tmp)
    
    
# min - max 범위로 돌면서 해당 높이를 맞추는 시간을 체크한다.

# 최소 시간을 구해야한다.
# 가능한 가장 큰 값으로 초깃값 설정.
least_time = 256*500*500
height = 0
for h in range(minimum, maximum+1):
    plus, minus = 0, 0
    for x in range(N):
        for y in range(M):
            tmp = maps[x][y] - h
            if tmp > 0:  # 목표높이보다 현재높이가 더 높은경우
                minus += tmp  # 블럭 갯수를 더해줌
            elif tmp < 0:  # 목표높이보다 현재높이가 더 낮은경우
                plus -= tmp  # tmp 값이 음수이기 떄문에 뺄셈 진행

    if minus + B >= plus:  # 필요한 블럭을 가지고 있는지 확인
        time = minus*2 + plus  # 블럭을 제거하는 행위는 2초의 시간을 소모
        if time <= least_time:
            least_time = time
            height = max(height, h)

print(least_time, height)