로그라는 숫자 목록과 다른 값 제한이 있다고 가정합니다. logs[i]의 각 요소는 i번째 사용자가 생성한 로그의 크기를 나타냅니다. 그리고 limit은 데이터베이스에 저장할 수 있는 총 로그 크기를 나타냅니다. 로그의 모든 로그를 최대 크기 x로 자르고 왼쪽 로그 크기의 합이 최대가 되도록 가장 큰 x를 찾아야 합니다. 잘라낼 로그가 없으면 가장 큰 로그 크기를 반환하기만 하면 됩니다.
따라서 입력이 로그 =[500, 200, 10000, 500, 4000] limit =3000과 같으면 출력은 900이 됩니다. 로그를 900으로 자르기 때문에 [500, 200, 900, 500]을 얻을 수 있습니다. , 900] 이제 합계는 3000입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- lo :=0
- hi :=1 + 최대 로그 수
- lo + 1 <안녕하세요
- mi :=lo + (hi - lo)/2의 바닥
- 목록에 있는 모든 요소의 합이 (로그의 각 로그에 대한 mi 및 log의 최소값) <=limit, then
- 로:=미
- 그렇지 않으면
- 안녕하세요 :=미
- 귀환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def solve(logs, limit): lo, hi = 0, max(logs) + 1 while lo + 1 < hi: mi = lo + (hi - lo) // 2 if sum(min(mi, log) for log in logs) <= limit: lo = mi else: hi = mi return lo logs = [500, 200, 10000, 500, 4000] limit = 3000 print(solve(logs, limit))
입력
[500, 200, 10000, 500, 4000], 3000
출력
900