题目地址:分巧克力
此题是一道比较经典也是比较简单的算法题,我觉得其中比较难得是如何在一整块巧克力确定能分为多少块。
既然用到了二分法,先介绍一下二分法的模板
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)