マカロニペンギンの健忘録

特にテーマを決めているわけじゃないが、私が気になったことを書いていく予定です。

灰色の戯言(AtCoder Beginner Contest 212 C - Min Difference)

2023年01月13日 | プログラミング
私はAtCoderの灰色です。現在、茶色を目指して健闘中です。

 
ただ、私の理解度が低すぎて今回練習で解いたABC212のC問題の解説をいくら読んでも理解できませんでした。しかし、奮闘の結果自力でなんとか解くことができました。
あくまでも今後のために記録として残しておきたいと思ったので、自分で解説を書くことにしました。
開発言語はPythonです。
n , m = map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
c_min = 10**9
for i in range(n):
    for j in range(m):
        c_min = min(c_min,abs(a[i]-b[j]))
print(c_min)

上記の全検索だとタイムオーバー(TLE)になってしまいます。

そこで

Aリスト、Bリスト共にソートしたものを、i及びjの小さい順にAとBを比較、AまたはBの小さい側は一つ右にシフトして、再びAとBを比較します。それを繰り返します。
①A1とB1を比較、Aが小さい
②Aが右に移動(i += 1)
③A2とB1を比較、Bが小さい
④Bが右に移動(j += 1)
⑤A2とB2を比較、Aが小さい
⑥Aが右に移動(i += 1)
⑦A3とB2を比較
その間にAi-Bjの値を比較して、最も差が小さい数字を出力します。

n , m  = map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
a.sort()
b.sort()
c = 10**9
i = j = 0
 
while i < n and j < m:
    c = min(c,abs(a[i]-b[j]))
    if a[i] < b[j]:
        i += 1
    else:
        j += 1
print(c)


最新の画像もっと見る

コメントを投稿