https://www.acmicpc.net/problem/1654
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.
www.acmicpc.net
해결 방법
> left는 1(문제에서 최소 길이가 1이라고 함), right는 주어진 랜선 중 최대값
> 이분 탐색을 돌린다.
> right를 출력한다.
Right를 출력하는 이유
1. 이분 탐색을 돌릴 때 조건을 left <= right로 주었다.(right가 left보다 작아진 첫 시점이 출력시점)
2. 문제 조건 중 N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다.
2- 1. 이분 탐색을 돌리는 중에 N개보다 많이 만들어질 수도 있다. 하지만 2 - 2조건에 의해 정답이 아닐수 있다.
2- 2. 문제 조건 중 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오.
코드
k, n = map(int, input().split())
cable = list()
for i in range(k):
cable.append(int(input()))
left = 1
right = max(cable)
while left <= right:
mid = (left + right) // 2
tmp = 0
for i in cable:
tmp += i // mid
if tmp < n:
right = mid - 1
else:
left = mid + 1
print(right)
'알고리즘' 카테고리의 다른 글
백준_2110_공유기 설치 (0) | 2020.02.21 |
---|---|
백준_10816_숫자카드2(Counter) (0) | 2020.02.20 |
백준_2512_예산(이분 탐색) (0) | 2020.02.18 |
백준_15997_승부 예측 (0) | 2020.02.17 |
백준_10815_숫자 카드(이분 탐색) (0) | 2020.02.16 |
댓글