白準2470号:2種類の溶液
7421 ワード
質問する https://www.acmicpc.net/problem/2470 異なるN個の値の中から2個を選択し、最も近い組合せ を検索する.
きろくてんナビゲーションの問題へのアクセス方法 すべての優先事項を理解する数 探索の範囲を効果的に縮小する方法 方法問題確認 異なるN個の値に2つの値を追加して、最適(0)の組合せ を検索する.最適な組み合わせを探すナビゲーション問題 まずすべての場合の検索数を理解し、 を効率的に検索する方法を考えます.
ナビゲーションが必要なすべての状況を把握 所与のN個の数字の中から2個の数字のnC 2組合せ を選択する.
より効果的に範囲を縮小する方法を探しています Aを選択 A+B=0の場合 の最適な組み合わせが見つかり、ナビゲーションは を終了した.
A+B<0の場合 AまたはBを再培養し、 の最適な組み合わせがあるかどうかを探索する.では、次のことが確認されました. Aに基づいて、Bより小さい値 を決定する必要はない. Bに基づいて、Aより小さい値 を決定する必要はない.(いずれにしても組み合わせは、その総和がより小さくなるため、最適な組み合わせから遠ざかる) .
そのため、次の追加ナビゲーションを実行します. Aを基準としてBより大きい組み合わせに縮小し、 に移動する. Bを基準としてAより大きい組み合わせに縮小し、 に移動する.
A+B>0の場合 AまたはBをさらに低減することにより、最適な組合せ が存在するか否かを探索する.では、次のことが確認されました. Aに基づいて、Bより大きい値 を決定する必要はない. Bに基づいて、Aより大きい値 を決定する必要はない.(いずれにしても組み合わせは、その総和がより大きくなるため、最適な組み合わせから遠ざかる) .
そのため、次の追加ナビゲーションを実行します. Aを基準としてBより小さい組み合わせに縮小し、 に移動する. Bを基準としてAより小さい組み合わせに縮小し、 に移動する.
は、上記のナビゲーションを行うように構成することができる. N個の数字を揃えなければなりません A以上の値またはA未満の値は識別可能である. B以下の値は、 Aはシーケンスではなく、組み合わせである.BがAより小さい場合、 のため、繰り返しナビゲーションが発生する.は、[1,2,3,4,5,6,7]において、A,Bがそれぞれ3,4のとき、 3+4>0. 3を基準とすると、4未満の値[1,2](3,-1)をナビゲートする必要があり、(3,-2)は最終的には(-1,3)と(-2,3)と同じであるため、 を繰り返す可能性が高い.4に基づいて、3未満の値をナビゲートする必要があります[1,2](-1,4)(-2,4) を繰り返す可能性もあります.
ループを構成して Aループを起点として、AとBをそれぞれ最小値と最大値に設定し、 に設定する.ループのナビゲーション方向は であり、AおよびBはそれぞれアレイの中央に収束する
回答の提出
ループ不変性
内容 Aが完了する. Aが完了する. Aである.
しょきじょうけん Aは最小値であり、ナビゲーション可能なA より小さくてはならない. Bは最大値であり、ナビゲーション可能なB より大きくはならない.
維持条件 A+B=0の場合、最適な組み合わせナビゲーション が完了する. A+B<0の場合、Aを基準として「B格上」またはBを基準として「A格上」を検索すると、「B格上」は既に検索完了状態にあるため、「A格上」 を検索する. A+B>0の場合、Aを基準として「B下段」または「A下段」を基準とすると、このとき「A下段」は既にナビゲーション完了状態にあるため、「B下段」はナビゲーション となる.のナビゲーション中に最適な組み合わせが見つかるたびに更新される場合、その組み合わせは、その時点までにナビゲートする最適な組み合わせ である.
終了条件 A>=B退出ループ すべての組合せから最適な組合せへのナビゲーション完了
きろくてん
ループを構成して
回答の提出
ループ不変性
内容
しょきじょうけん
維持条件
終了条件
import sys
N = int(sys.stdin.readline())
values = list(map(int, sys.stdin.readline().split()))
values.sort()
a, b = 0, len(values)-1
optimal = (values[a], values[b], abs(values[a]+values[b]))
while values[a] < values[b]:
A, B = values[a], values[b]
score = abs(A + B)
if score < optimal[2]:
optimal = (A, B, score)
if A + B == 0:
break
elif A + B < 0:
a += 1
else:
b -= 1
print(optimal[0], optimal[1])
Reference
この問題について(白準2470号:2種類の溶液), 我々は、より多くの情報をここで見つけました https://velog.io/@johnny/beak-2470テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol