白俊回答-2230回選択
📜 理解问题
N個の整数からなる数列A[1],A[2],...,A[N]がある.この数列で2つの数(同じ数かもしれません)を選択する場合は、Mよりも差が大きく、最小のプログラムを作成します.
たとえば、カラム{1,2,3,4,5}を数えます.M=3の場合、1 4、1 5、2 5を選択した場合、その差はMより大きい.ここで最も差が少ないのは、1 4または2 5を選択したときの3です.
💡 問題の再定義
出力がMより大きく、最小の差.
▼▼▼計画作成
まず入力をソートします.並べ替えの理由は、二重ポインタを使用するために、整列したデータを使用する必要があるからです.
ソートに成功した場合は、startインデックスとendインデックスの和がMより大きいかどうかをダブルポインタで確認し、Mより大きい場合はstartを増やし、最小の差を決定してmindifferenceを更新します.Mより小さい場合はendを増やして次の入力との和を求める.以上の手順はstartもendもNになるまで繰り返される.
この場合、startとendのインデックスの差が大きいほど値の差が大きくなり、インデックスの差が小さいほど値の差が小さくなるため、ダブルポインタでソートできます.
💻 計画の実行
import sys
if __name__ == '__main__':
N, M = map(int, sys.stdin.readline().split())
nums = []
min_difference = float("inf")
for i in range(N):
nums.append(int(sys.stdin.readline().rstrip()))
nums.sort()
start = 0
end = 1
while start < end:
difference = nums[end] - nums[start]
if difference >= M:
if min_difference > difference:
min_difference = difference
start += 1
if start == end and end != N - 1:
end += 1
else:
if end == N - 1:
start += 1
else:
end += 1
print(min_difference)
🤔 振り返る
これは,ソートと二重ポインタを用いると,部分的なマージ問題でなくても利用できることを意識した問題である.
Reference
この問題について(白俊回答-2230回選択), 我々は、より多くの情報をここで見つけました https://velog.io/@delicate1290/백준-문제-풀이-수-고르기-2230번テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol