[これがコードテスト]バイナリ探索-トッポッキ作り


バイナリナビゲーション
検索するデータと中間位置にあるデータを繰り返し比較して、必要なデータを検索します.
に質問
一包みに入った餅の全長をカッターで切り分けて合わせます.切り餅機に高さ(H)を指定すると、一度に一列に切り分けることができます.お客様が来たときに、要求される全長がMであれば、少なくともMのお菓子を得るために、カッターが設定できる最高高さの値を求めるプログラムを作成してください.
入力例
4 6
19 15 10 17
出力例
15
💻 コード#コード#
# 1부터 가장 긴 떡의 길이까지 이진 탐색. 중간값을 절단기에 설정한 높이
# target은 요청한 길이 M
def binary_search(array, target, start, end):
    while start <= end:
        mid = (start + end) // 2
        
        total_length = 0 
        
        for i in array:
            if i > mid:
                total_length += i - mid
        if total_length == target:
            return mid
        # 절단한 떡의 총 길이가 요청한 길이보다 길다면 높이가 더 커야한다.
        elif total_length > target:
            start = mid + 1
        else:
            end = mid - 1
        total_length = 0

N, M = map(int, input().split())

array = list(map(int, input().split()))

print(binary_search(array), 6, 1, max(array))
デザイン
1~最長ケーキの長さをバイナリナビゲーションノードに設定し、カッターの高さを中間値にします.中間値を基準として、お客様が要求する全長と一致する場合は、中間値を切り餅の高さに設定します.
問題を解く
カッターの高さHを繰り返し調整することがこの問題の核心である.
シーケンシャルナビゲーションは可能ですが、カッターの高さは1~20,000,000,000,000,000であるため、シーケンシャルナビゲーションはタイムアウトします.
📝 整理する
入力条件が1億個を超えると,シーケンス探索よりバイナリ探索を思い出す.