#問題
AtCoder Beginner Contest 205 D問題 より
#方針
checkとliの1つのリストは、各Kの入力に対してそれに対応する今回の問題の答えが「check[i]より大きい時(iはそのような条件を満たす最小の値)、その答えの値からli[i]を引いたものがKである」と言う風に考え設定しました。例えば、「入力例1」で言うとK2にあたる5について言えば、それに対応する答えの9が「check[4] = 7より大きい時、その答えの値からli[4] = 4を引いたもの(=5)がKである」といった要領です。この方針ではAC×21, WA×2でほとんどのテストケースには正解しているのですが、ごく一部のケースで間違いであるようです。昨日行われたばかりのコンテストであるため、テストケース自体は未だ公開されておりません。
#ソースコード
Python
1from itertools import accumulate 2from bisect import bisect_left 3 4N, Q = map(int, input().split()) 5A = list(map(int, input().split())) 6 7check = [0] + [a for a in A] 8li = [0] + list(accumulate([1 for _ in range(len(check) - 1)])) 9#[0, 3, 5, 6, 7] 10#[0, 1, 2, 3, 4] 11 12def find_ind(k): 13 left = 1 14 right = 10 ** 19 15 while right - left > 1: 16 mid = (left + right) // 2 17 if mid - li[bisect_left(check, mid) - 1] <= k: 18 left = mid 19 else: 20 right = mid 21 return left 22for _ in range(Q): 23 K = int(input()) 24 print(find_ind(K))
#考えたこと・質問
何か見えない例外が発生し、本当の答えが実はleftではなくrightなのではないか?と言うことを考え、leftが条件式left - li[bisect_left(check, left) - 1] == kを満たさない場合はrightを代わりに出力するようにしても、やはり該当のテストケース2つでWAをくらったため、leftにもrightにも正解がないようなケースが発生していることがわかりました。どのような見落としが考えられるのでしょうか。自分で思いつくケースは色々と模索したものの一向に答えにたどり着く兆しが見えません。お力添え頂ける箇所がございましたら、ご教授のほど何卒よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/15 00:45