import sys
import math
def input():
return sys.stdin.readline().rstrip()
def check(max_hp):
cu_atk = input_atk
cu_hp = max_hp
for command,atk,hp in arr:
if command == 1:
atk_cnt = math.ceil(hp/cu_atk)
cu_hp -= (atk_cnt-1)*atk
if cu_hp<=0:
return False
else:
cu_atk += atk
cu_hp += hp
if cu_hp> max_hp:
cu_hp = max_hp
return True
N,input_atk = map(int,input().split())
arr = []
for _ in range(N):
t,a,h = map(int,input().split())
arr.append((t,a,h))
left = 0
right = 999999000001*123456
while left+1<right:
mid = (left+right)//2
if check(mid):
right = mid
else:
left = mid
print(right)
첫 풀이는 전형적인 이분탐색 풀이이다.
올림을 통해 적 hp를 현재 용사의 공격력으로 나눈 몫을 올림을 해서 용사의 공격횟수를 구했다.
그리고 마지막 공격으로 적이 죽었을때에는 공격을 맞지 않으므로, 용사의 공격횟수에서 -1을 하고
몬스터의 공격력 만큼 곱해서 용사의 hp를 줄여준다.
이때 0보다 이하이면, False를 반환해준다.
그리고 물약이 있는곳이 생기면 용사의 공격력을 올려주고, 설정된 최대피를 넘어가게 회복되면 최대피로 바꿔주면 된다.
이런식으로 해서 용사가 죽지않고 던전을 돌파할 수 있는 최소 피를 구하면 된다.
import sys
import math
def input():
return sys.stdin.readline()
N,user_atk = map(int,input().split())
max_hp = 0
acc_hp = 0
# 데미지는 마이너스
# 힐은 플러스
damage_or_heal = 0
arr = [list(map(int,input().split())) for _ in range(N)]
for command,atk,hp in arr:
if command == 1:
atk_cnt = math.ceil(hp/user_atk)
damage_or_heal = -(atk_cnt-1)*atk
else:
user_atk += atk
damage_or_heal = hp
acc_hp += damage_or_heal
if acc_hp>0:
acc_hp = 0
max_hp = max(max_hp,abs(acc_hp))
print(max_hp+1)
두번째 풀이는 신박한 풀이였다.
최대 누적 데미지를 계산을 해서 푸는 방식이였다.
이 방식은 단 한번의 반복문으로 구할 수 있으므로, 윗 방식보다 더 빠른 방식이다.
최대 누적데미지를 구하는 방식은 다음과 같다.
damage_or_heal은 용사가 받은 데미지나 heal을 나타내는 것이다.
데미지이면 마이너스값을 받고, heal이면 플러스 값을 받는다.
max_hp는 우리가 구할 최대 hp이다.
acc_hp는 현재까지 누적된 데미지라고 생각하면 된다.
damage_or_heal은 위에서 구한 것처럼 몬스터의 공격데미지와 힐을 구해서 만들어주면 된다.
여기서 중요한것은 acc_hp에 이 값을 더해주는 것이다.
이 값이 0보다 크게 되면 용사는 지금까지누적된 데미지를 넘어서 회복을 하게 된것 이므로 과다힐이 된것이다.
그래서 acc_hp 값이 0보다 크게 되면 0으로 초기화를 시켜준다.
그리고 acc_hp가 -이면 현재턴에서 용사가 딱 죽을 hp이다.
즉 용사가 acc_hp의 절대값만큼의 hp를 가지고 있으면 이 해당턴에서 딱 0이 되어서 죽는것이다.
우리는 이 acc_hp의 절대값과 max_hp와 최대값을 계속 비교를 해서,
각 턴마다, 용사가 받는 최대 데미지를 구해준다.
이렇게 구한 max_hp를 가지고 용사가 던전에 들어가게 되면 중간에 피가 0이되어 죽으므로, 이 값보다 딱 1을 높게 해주면,
용사는 던전을 탐험하는 도중 받을수 있는 해당 턴의 누적데미지보다 hp가 크므로 죽지않고 던전을 돌파할 수 있게 된다.
이분 탐색이 아닌 방식으로도 풀 수 있는 것이었다.