https://www.acmicpc.net/problem/6236
6236번: 용돈 관리
현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로
www.acmicpc.net
이진탐색문제.
반례에 대해서 생각을 해보니, 하루지출 금액보다 인출하는 돈이 더 적으면 하루를 넘어 갈 수 없다.
이부분만 잘 생각한다면 다른 기본 이진탐색과 큰 차이가 없음
n,m = list(map(int,input().split()))
arr = [0]*n
for i in range(n):
arr[i] = int(input())
st = min(arr)
ed = sum(arr)
while st <= ed:
mid = (st + ed)//2
k = 0 # 지불해야 하는 금액
cnt = 1
for i in range(n):
if mid - (k+arr[i]) >=0:
k += arr[i]
continue
else:
cnt+=1
k = arr[i]
# m번보다 더 많이 인출하거나 인출금액이 하루의 사용금액보다 더 적은경우
if cnt > m or mid < max(arr):
st = mid +1
else:
ed = mid -1
l = mid
print(l)
'Algorithm > baekjoon' 카테고리의 다른 글
baekjoon 2110: 공유기 설치 (0) | 2022.07.19 |
---|---|
baekjoon 1654: 랜선 자르기 (0) | 2022.07.15 |
baekjoon 2343: 기타 레슨 (0) | 2022.07.13 |
baekjoon 2512: 예산 (0) | 2022.07.12 |
baekjoon 2805: 나무 자르기 (0) | 2022.07.08 |
댓글