강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N
개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경우에는 강의의 흐름이 끊겨, 학생들이 대혼란에 빠질 수 있기 때문이다. 즉, i
번 강의와 j
번 강의를 같은 블루레이에 녹화하려면 i
와 j
사이의 모든 강의도 같은 블루레이에 녹화해야 한다.
강토는 이 블루레이가 얼마나 팔릴지 아직 알 수 없기 때문에, 블루레이의 개수를 가급적 줄이려고 한다. 오랜 고민 끝에 강토는 M
개의 블루레이에 모든 기타 강의 동영상을 녹화하기로 했다. 이때, 블루레이의 크기(녹화 가능한 길이)를 최소로 하려고 한다. 단, M
개의 블루레이는 모두 같은 크기이어야 한다.
강토의 각 강의의 길이가 분 단위(자연수)로 주어진다. 이때, 가능한 블루레이의 크기 중 최소를 구하는 프로그램을 작성하시오.
N (1 ≤ N ≤ 100,000)
과 M (1 ≤ M ≤ N)
이 주어진다. 다음 줄에는 강토의 기타 강의의 길이가 강의 순서대로 분 단위로(자연수)로 주어진다. 각 강의의 길이는 10,000
분을 넘지 않는다.N, M= map(int,input().split())
lecture_time = list(map(int, input().split()))
start = max(lecture_time) # (예 : 9) 블루레이 용량의 최댓값
end = sum(lecture_time) # (예 : 45) 블루레이 용량의 합
answer = 0
while start <= end:
mid = (start + end) // 2 # 임시 블루레이 용량 (예 : 27)
blueray_num = 1 # 1번 블루레이
remain = mid # (예: 27)
for i in range(N): #
if remain < lecture_time[i]: # 임시 블루레이 용량이 강의 시간보다 작으면
blueray_num += 1 # 다음 블루레이로
remain = mid # 새 블루레이 용량 초기화
remain -= lecture_time[i] # 현재 강의를 블루레이에 담는다
if blueray_num <= M: # 사용한 블루레이 개수가 M개 이하면
answer = mid # 현재 크기를 정답 후보로 answer에 저장
end = mid - 1 # 탐색을 더 작은 부분에서 해줌
else: # mid의 용량으로는 M개 블루레이 안에 못넣음
start = mid + 1 # 더 큰 부분에서 해줌
print(answer)
start
값은 용량의 최댓값 end
는 블루레이 용량의합 mid
값을 임시 블루레이 용량으로 설정blueray_num
설정 mid
로 값 기억remain -= lecture_time[i]
answer
에 저장n, m = map(int,input().split())
time = list(map(int,input().split()))
start = max(time)
end = sum(time)
while start <= end:
mid = (start + end) // 2
total = 0
count = 1
for t in time:
if total + t > mid:
count += 1
total = 0
total += t
if count <= m:
ans = mid
end = mid - 1
else:
start = mid + 1
print(ans)