问题描述
Lazy有N个礼物需要打成M个包裹,邮寄给M个人,这些礼物虽然很便宜,但是很重。Lazy希望每个人得到的礼物的编号都是连续的。为了避免支付高昂的超重费,他还希望让包裹的最大重量最小。
输入格式
一行两个整数N和M。
一行N个整数,表示N个礼物的重量。输出格式
一个整数,表示最小的最大重量。
样例输入
3 2
1 1 2样例输出
2
数据规模和约定
N, M <= 100,000
重量 <= 1,000
n,m=map(int,input().split())
arr=list(map(int,input().split()))
def check(target): # 看能否以target为最大重量,进行分堆。即堆的总数量,有没有超过 m
count = 0
tmp = 0
i = 0
while i <= n-1:
count += arr[i]
if count > target:
count = 0
tmp += 1
i -= 1
elif i == n-1:
tmp += 1
i += 1
return tmp <= m
def bin_search():
left = max(arr)
right = sum(arr)
while left < right:
mid = (left + right)//2 # 取均值
if check(mid): # 调用check()函数
right = mid
else:
left = mid + 1
return left
print(bin_search())