용사는 공주를 구하기 위해 무시무시한 용이 있는 던전으로 향하기로 하였습니다. 우선 용사는 용사 자신과 던전을 분석하였습니다.
용사에게는 세 종류의 능력치가 있습니다.
던전은 총 N개의 방으로 이루어져 있고 i번째 방을 통해서만 i+1번째 방으로 이동 할 수 있습니다. 방에는 포션이 있거나 몬스터가 있는데 몬스터가 있을 경우 몬스터를 쓰러트려야지 다음방으로 이동 할 수 있습니다. N번째 방에는 공주와 용이 있고, 용을 무찌르면 공주를 구할 수 있습니다.
몬스터가 있는 방에 올 경우 다음과 같이 전투가 진행됩니다.
포션이 있는 방에 올 경우 포션을 마셔서 현재 용사의 생명력 HCurHP가 일정량 회복되고 공격력 HATK도 일정량만큼 증가됩니다. 회복된 생명력이 최대 생명력 HMaxHP보다 큰 경우 용사의 현재 생명력 HCurHP가 최대 생명력 HMaxHP와 같아집니다.
용사는 던전으로 향하기 전에 만반의 준비를 하고 있습니다. 용사는 수련을 하면 최대 생명력 HMaxHP를 늘릴 수 있는데 얼마나 수련해야 할지 고민입니다.
용사는 N번 방에 있는 용을 쓰러트리기 위한 최소의 HMaxHP를 여러분이 계산해주면 좋겠다고 합니다.
3 3
1 1 20
2 3 10
1 3 100
49
1 1
1 1000000 1000000
999999000001
import math
N, H = map(int, input().split())
dungeons = [list(map(int, input().split())) for _ in range(N)]
lt = 1
rt = 1
for t, a, h in dungeons: # 총 받는 데미지의 합을 rt로 정함
if t == 1:
rt += math.ceil(h / H) * a
rst = 0 # 결과 담을 변수
while lt <= rt: # 이분탐색 시작
mid = (lt + rt) // 2 # mid 정의. 초기 생명력
attack = H # 현재 공격력과 생명력
hp = mid
for t, a, h in dungeons:
if t == 1: # 몬스터 있는 경우
# 싸우는 횟수.
numOfFight = min(math.ceil(h / attack), math.ceil(hp / a))
# 싸운 만큼 서로의 생명력 깎음.
h -= numOfFight * attack
hp -= numOfFight * a
# 용사가 이긴 경우
if h <= 0:
# 용사가 먼저 때리기에 이겼으면 마지막에는 생명력이 깎일 일이 없으므로 다시 회복
hp += a
continue
# 용사가 진 경우
if hp <= 0:
break
else: # 몬스터가 아닌 포션이 있는 경우
attack += a # 공격력 증가
hp += h # 생명력 회복
if hp > mid: # 회복된 생명력이 최대 생명력보다 크면
hp = mid # 최대 생명력에 맞춤
else: # 용사가 무사히 모두 무찌른 경우
rt = mid - 1 # 생명력이 남기에 rt값을 줄임
rst = mid # 값 저장
if hp <= 0: # 용사가 죽은 경우
lt = mid + 1 # 생명력이 부족하기에 lt값 키움
print(rst)