编程题记录2
二分法
题目链接
https://www.lanqiao.cn/problems/99/learning/?page=1&first_category_id=1&second_category_id=3&tags=%E7%9C%81%E8%B5%9B&tag_relation=intersection
n, k = map(int, input().split())
ls = [[0]*2 for _ in range(n)]
for i in range(n):
ls[i][0], ls[i][1] = map(int, input().split())
def check(x):
count = 0
# 遍历每个长方形
for j in range(n):
# 保证最小边长要比x大
min_len = min(ls[j][0], ls[j][1])
if min_len < x:
continue
else:
count += (ls[j][0]//x) * (ls[j][1]//x)
# 如果这种方案能切出的巧克力比人数多,说明边长还能更长
if count >= k:
return True
else:
return False
# 采用二分法进行遍历
l, r = 0, 100001
while l+1 != r:
mid = (l+r)//2
# 如果mid数据可以,说明边长偏小
if check(mid):
l = mid
else:
r = mid
if check(l):
print(l)
else:
print(r)