ABC 023 D 射撃王【Python】
問題はこちら。
得点 X が可能かどうかを判定する関数を作って二分探索する。
初期高度が H, 上昇速度が S の風船を高度 X 以下で割るためには開始から (X - H) / S 秒以内に割らなければいけないということに着目する。
// 得点のMAXを超える適当な値を設定
INF = 2*10**14
// 得点 X が可能かどうかを判定する関数
def check(X):
data = [0]*N
for i in range(N):
H, S = HS[i]
j = (X - H) // S
if j < 0:
return False
data[min(j, N - 1)] += 1
if data[0] >= 2:
return False
for i in range(1, N):
data[i] += data[i - 1]
if data[i] >= i + 2:
return False
return True
// 入力
N = int(input())
HS = [tuple(map(int, input().split())) for _ in range(N)]
// 二分探索
l, u = 0, INF
while l < u:
m = (l + u) // 2
if check(m):
u = m
else:
l = m + 1
ans = l
// 出力
print(ans)
この記事が気に入ったらサポートをしてみませんか?