蓝桥云课——分巧克力 Python(二分法)

 


题目地址:分巧克力

        此题是一道比较经典也是比较简单的算法题,我觉得其中比较难得是如何在一整块巧克力确定能分为多少块。

        既然用到了二分法,先介绍一下二分法的模板

def check(mid):
    if 符合条件:
        return True
    return False


left = 1
right = 10000
while left <= right:  # 也可以为'<',有的题目若为'<='则会陷入无限循环,此道题就是
    mid = (left + right) // 2
    if check(mid):  # return 1则代表此值可以用,但是可能小于答案,故向右搜索
        left  = mid + 1
    else:  # return 0则代表此值不可以用,此数比答案大,故向左搜索
        right = mid

        那么我们如果来判断一整块巧克力中能分为多少块呢?因为我们要切为正方形,正方形的边是相等的,所以我们将巧克力的长宽分别÷正方形的边长(向下取整),再两者相乘便为切出小巧克力的个数。

        整体逻辑不是很难,所以在此直接放出完整代码:

N, K = map(int, input().split())
long = []
wide = []

for i in range(N):  # 将长宽添加
    a, b = map(int, input().split())
    long.append(a)
    wide.append(b)


def check(length):
    count = 0
    for i in range(len(long)):  # 长宽的个数是同步的
        count += (long[i] // length) * (wide[i] // length)
    if count >= K:  # 若能切的个数 > 小朋友个数说明此答案合适
        return True
    return False


left = 1
right = 100001
while left < right:
    mid = (left + right) // 2
    if check(mid):  # 可以取再大的边长
        left = mid + 1
    else:
        right = mid

print(left - 1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值