알고리즘
Python - 과자 나눠주기 (16401) 이분 탐색
jun.s.gi
2023. 6. 13. 16:21
728x90
https://www.acmicpc.net/problem/16401
16401번: 과자 나눠주기
첫째 줄에 조카의 수 M (1 ≤ M ≤ 1,000,000), 과자의 수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 과자 N개의 길이 L1, L2, ..., LN이 공백으로 구분되어 주어진다. 과자의 길이는 (1 ≤ L1, L2, ..., LN ≤ 1,
www.acmicpc.net
1. mid 길이만큼 막대 과자를 조카 수만큼 나누어 주었다면 최대한 긴 막대과자를 나누어 주어야 하므로 left = mid + 1
2. 정답이 나왔지만 길이를 줄이는 순간 left가 right보다 커질 때까지 left가 계속 커지므로 답은 right에 있습니다.
import sys
m, n = map(int, sys.stdin.readline().strip().split())
snack = list(map(int, sys.stdin.readline().strip().split()))
def BinarySearch():
le = 1
ri = max(snack)
mid = 0
while le <= ri:
mid = (le + ri) // 2
cnt = 0
for bar in snack:
cnt += bar // mid
if cnt >= m:
cnt = -1
break
if cnt == -1:
le = mid + 1
else:
ri = mid - 1
return ri
print(BinarySearch())
728x90