結果
問題 |
No.1286 Stone Skipping
|
ユーザー |
![]() |
提出日時 | 2023-08-30 18:02:01 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 50 ms / 2,000 ms |
コード長 | 811 bytes |
コンパイル時間 | 402 ms |
コンパイル使用メモリ | 82,608 KB |
実行使用メモリ | 64,828 KB |
最終ジャッジ日時 | 2025-01-02 11:52:49 |
合計ジャッジ時間 | 3,004 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
# 10**18 < 2**60であり跳ね返り回数は60回以下と言える # x, と跳ね返り回数k # 跳ね返り回数kを固定とすれば飛距離はxの単調増加となる # それでkごとにxを二分探索で求めるか D = int(input()) def distance(x, k): d = 0 x_ = x for k_ in range(k): d += x_ x_ //= 2 return d x_candidates = [] for k in range(1, 61): NG = 0 OK = D+1 while OK-NG>1: mid = (OK+NG)//2 if distance(mid, k)>=D: OK = mid else: NG = mid #print('k', k, 'OK', OK) # ここが怪しいよな、OK値でダメなら、OK+1などを調べる必要ないのか if distance(OK, k) == D: x_candidates.append(OK) #print(x_candidates) ans = min(x_candidates) print(ans)