有若干根木头,长度存于 wood 。每切一刀可以把一段木头分成两段。函数 check(wood, K, x) 返回: 用不超过 K 刀,能否使所有木段长度都不超过 x 。下面代码使用二分答案查找最小可行的 x ,横线处应填( )。 def binary_cut(wood, K): l = 1 r = 0 for length in wood: r = max(r, length) while l < r: mid = l + (r - l) // 2 if check(wood, K, mid): # ------------------------ # 在此处填入代码 else: l = mid + 1 return l
A:r = mid + 1
B:r = mid
C:l = mid
D:r = mid - 1
正确答案:B
答案解析
确定二分查找的边界条件,左边界 l 表示最小可能的切割后木段长度,右边界 r 表示原始最长木头长度。在每轮循环中计算中点 mid,通过 check 函数判断是否能在 K 刀内使所有木段长度不超过 mid。若 check(wood, K, mid) 为真,说明 mid 可行,应尝试更小的值,收缩上界;此时更新 r 以包含可行解区间。若 check(wood, K, mid) 为假,说明 mid 不可行,需增大切割后长度上限,调整下界。根据二分结构,更新边界时必须保证区间收敛且不遗漏可行解,mid 的取值方式决定边界更新方式。
试卷来源:202606 CCF-GESP编程能力等级认证Python五级真题