

import os
import sys
import math
# 请在此输入您的代码
def process(N,K):
all_num = 0
H = []
W = []
# 循环输入N块巧克力的形状
for _ in range(N):
h, w = map(int, input().split())
H.append(h)
W.append(w)
all_num += h * w
if all_num < (K * 4):
return 1
else:
flg = int(math.sqrt(all_num // K)) # 能分到的最大块巧克力的上限值
while flg > 0:
part_nums = 0
for j in range(N):
h = H[j] // flg
w = W[j] // flg
part_nums += h * w
if part_nums >= K:
return flg
else:
flg -= 1
N, K = map(int, input().split())
res = process(N,K)
print(res)

题解:
import os
import sys
# 请在此输入您的代码
def process(N,K):
# 循环输入N块巧克力的形状
all_num = 0
H = []
W = []
for _ in range(N):
h, w = map(int, input().split())
H.append(h)
W.append(w)
all_num += h * w
top = max(max(H), max(W)) # 能分到的最大块巧克力的上限值
left = 1
right = top
while left < right:
part_nums = 0
mid = (left + right + 1)//2 # 计算中间值
for j in range(N):
h = H[j] // mid
w = W[j] // mid
part_nums += h * w
if part_nums >= K:
break
if part_nums >= K: # 如果能通过,继续查找更大的边长
left = mid
else:
right = mid - 1 # 如果不能通过,查找更小的边长
return left
N, K = map(int, input().split())
res = process(N,K)
print(res)
误点:
二分索引设置有问题,导致更新策略出错。