打包(python二分法)

问题描述

  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())

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值