BOJ 2473歳溶液


https://www.acmicpc.net/problem/2473
1秒、256 MBメモリ
input :
  • N (3 <= N <= 5000)
  • N個の溶液特性値(-100000000000<=溶液<=10000000000)
  • output :
    3つの溶液の特性値はであり、
  • 0に最も近い.
  • 特性値の昇順出力
  • 条件:
  • 酸性溶液の特性値は1~10000000,
  • である.
  • 塩基性溶液の特性値は-1から-10000000
  • 二分探索を行うべきかどうか考えていますが、これを行うには溶液を固定する必要があります.そして固定的にどうするかが問題です
    3つだけ抽出するには410億の演算が必要で、これは不可能です.
    どうすればいいか探さなければなりません
    完全な探索を利用して1つの溶液を固定し,別の2つの溶液を探すだけでは全く予想されなかった.思ったより虚脱だったのですが、この方法を見てグルキンだと認めました.
    優先順位を付けます.アルカリ性は負数,酸性は正数であるため,並べ替えにより得られる利点がある.
    また、3種類の溶液のうち、第1の溶液は常に第iの溶液で固定されている.ゲートが0からn-2に回ると全ての場合の数が見られるので、中間点で前面部分の溶液が見えない場合はありません.
    for文を実行し、その内部に二重ポインタを使用し、以前の値と現在の溶液の和を比較する必要があります.ゼロに近いのは、割引が使いやすいことです.
    temp、絶対値を比較値に加算し、比較-tempを正の値にする場合は、tempを0に近い値に置き換える必要があります.
    temp値が0より大きい場合は、right-=1の正の値を小さくすることで0に近づきます.
    小さい場合はleft+=1で負の値を小さくし、0に近づきます.
    import sys
    from collections import deque
    
    n = int(sys.stdin.readline())
    data = list(map(int, sys.stdin.readline().split()))
    data.sort()
    ans = deque([(float('INF'), 0, 0, 0)])
    
    for i in range(n - 2):
        left = i + 1
        right = len(data) - 1
    
        while left < right:
            temp = data[i] + data[left] + data[right]
            compare, prev_i, prev_left, prev_right = ans.popleft()
    
            if abs(compare) > abs(temp):
                ans.append((temp, i, left, right))
            else:
                ans.append((compare, prev_i, prev_left, prev_right))
    
            if temp > 0:
                right -= 1
            else:
                left += 1
    
    val, i, left, right = ans.popleft()
    print(f"{data[i]} {data[left]} {data[right]}")