https://www.acmicpc.net/problem/18113
18113번: 그르다 김가놈
첫 번째 줄에 손질해야 하는 김밥의 개수 N, 꼬다리의 길이 K, 김밥조각의 최소 개수 M이 주어진다. (1 ≤ N ≤ 106, 1 ≤ K, M ≤ 109, N, K, M은 정수) 두 번째 줄부터 김밥의 길이 L이 N개 주어진다.
www.acmicpc.net
1. 입력을 받으면서 손질을 해준다. 이때 K보다 같거나 작은 길이는 그냥 버린다.
2. P의 길이를 low = 1, high = 10**9 로 하여 이분탐색한다.
import sys
input = sys.stdin.readline
N, K, M = map(int, input().split())
length = []
for _ in range(N):
L = int(input())
if (L>=2*K):
length.append(L-2*K)
elif (L>K):
length.append(L-K)
low = 1
high = 10**9
ans = -1
while (low <= high):
mid = (low+high)//2
tmp = 0
for i in length:
tmp+=i//mid
if (tmp >= M):
low = mid + 1
ans = max(ans, mid)
else:
high = mid - 1
print(ans)
python은 시간초과가 나고 pypy3로 해야 통과한다.
'알고리즘💻 > 이분탐색&정렬&분할정복' 카테고리의 다른 글
BOJ 1477번: 휴게소 세우기 (0) | 2021.08.06 |
---|---|
BOJ 1074번: Z (0) | 2021.08.05 |
BOJ 1377번: 버블 소트 (0) | 2021.07.19 |
BOJ 11582번: 치킨 TOP N (0) | 2021.07.19 |
BOJ 1448: 삼각형 만들기 (0) | 2021.07.19 |