def solution(arr, num): # 工作清单和工人数目 | O(N*logS), S=sum(arr) assert arr and len(arr) and num if len(arr) <= num: # 如果工人过多,则是取最长的一个工作返回 return max(arr) def get_need_num(limit): # 每个画师只能工作不超过limit的时间,问需要几个画师才能完成 res, worked = 1, 0 # 已用画师数目, 当前画师已工作时间 for v in arr: if v > limit: # 这一幅画哪怕单独分配给一个画师也完成不了 return float('inf') worked += v if worked > limit: # 如果尝试画当前的画已超工时 res += 1 # 新增一个画师来画这幅画 worked = v # 新增画师的当前工时为v return res min_sum, max_sum = 0, sum(arr) # 二分法确定每个画师的最大工作量 while min_sum != max_sum - 1: mid = (min_sum + max_sum) // 2 if get_need_num(mid) > num: min_sum = mid else: max_sum = mid return max_sum n, num = map(int, input().split()) arrs = list(map(int, input().split())) print(solution(arrs, num))