[プログラマー]入国審査


https://programmers.co.kr/learn/courses/30/lessons/43238
初めて問題を見たとき、どうしてこの人を探したのですか.ちょっと悩んだ
入力データが10000000である可能性がある場合、完全検出を行うとすぐにタイムアウトすると判断します.
さらに1000000*10000000を格納する数も考慮したが、Pythonの整数範囲は-922337203685475808~922337203685475807であることが分かった.
次のように2つのアイデアがあります.
  • ビット探索:時間のかかる候補群から最小の正解を選択する.(これを二分探索法とする)候補群が正解の関数になるか否かを判断する必要がある.
  • 候補軍が正解になるかどうかの判断部分は思い出せないが、審査員一人一人がその時間帯に何人もらえるかを考慮し、その積算値に人数を含めると、その時間が正解になる.
    △例えば、30時間で6人全員がもらえることを考えれば、7-審査員は最大4人、10-審査員は最大3人までもらえるので、7人までカバーできる.
  • from functools import reduce
    
    
    def check(mid, times, n):
        if n <= reduce(lambda acc, cur: acc + int(mid / cur), times, 0):
            return True
        return False
    
    
    def solution(n, times):
        answer = 0
        max_num = max(times)
    
        left = 0
        right = max_num * n
    
        while left < right:
            mid = int((left + right) / 2)
            if check(mid, times, n):
                answer = mid
                right = mid
            else:
                left = mid + 1
    
        return answer

    Reference


    https://technote.kr/183