백준
백준 1654 랜선 자르기 (파이썬)
chldkato
2020. 6. 5. 22:08
https://www.acmicpc.net/problem/1654
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
1. 이분탐색을 위해 left를 0, right를 입력받은 랜선 길이의 최대값으로 설정한다
2. 만일 mid가 0이면 (left가 0, right가 1일 때) 길이 1로 자르는 경우밖에 없으므로 답을 1로 저장하고 break한다
3. 각 랜선을 mid로 나눴을 때의 몫이 mid 길이로 자를 때 얻을 수 있는 랜선의 개수가 된다
개수가 n보다 크거나 같으면 ans를 갱신한다
import sys
input = sys.stdin.readline
def f(mid):
cnt = 0
for i in range(len(a)):
cnt += a[i] // mid
return cnt
k, n = map(int, input().split())
a = []
for _ in range(k):
a.append(int(input()))
left, right, ans = 0, max(a), 0
while left <= right:
mid = (left + right) // 2
if mid == 0:
ans = 1
break
cnt = f(mid)
if cnt >= n:
ans = max(ans, mid)
left = mid + 1
else:
right = mid - 1
print(ans)