목차

군수품 창고 정리

ps
링크acmicpc.net/…
출처BOJ
문제 번호31412
문제명군수품 창고 정리
레벨플래티넘 5
분류

이분탐색

시간복잡도O(m!*m*logn*log(a*n))
인풋사이즈n<=500,000, m<=7, a<=1,000,000
사용한 언어Python 3.11
제출기록93984KB / 668ms
최고기록668ms
해결날짜2024/02/20
출처

제3회 보라매컵 본선 Open Contest - G

풀이

코드

"""Solution code for "BOJ 31412. 군수품 창고 정리".

- Problem link: https://www.acmicpc.net/problem/31412
- Solution link: http://www.teferi.net/ps/problems/boj/31412

Tags: [binary search]
"""

import bisect
import functools
import itertools
from teflib import binsearch


def is_vaild(limit, psum, b):
    for b_perm in itertools.permutations(b):
        prev = 0
        for b_i in b_perm:
            pos = bisect.bisect_right(psum, prev + b_i * limit)
            if pos == len(psum):
                return True
            prev = psum[pos - 1]
    return False


def main():
    N, M = [int(x) for x in input().split()]  # pylint: disable=unused-variable
    a = [int(x) for x in input().split()]
    b = [int(x) for x in input().split()]

    psum = [v := 0] + [v := v + x for x in a]
    is_valid_func = functools.partial(is_vaild, psum=psum, b=b)
    answer = binsearch.minimum_valid_integer(1, sum(a) + 1, is_valid_func)

    print(answer)


if __name__ == '__main__':
    main()