二分例题两道 POJ1064 POJ2456
POJ1064
N条绳子, 长度分别Li, 切出K条长度相等的, 每条最长多长?
令C(x)代表是否可以得到K条长度为x的绳子.
对x的取值二分查找, 找到满足条件的最大的x即可.
由于是double二分, 有两种控制精度的写法
方法一:
for (int i = 0; i < 100; i++) { double mid = (lb + ub) / 2; if (C(mid)) lb = mid; else ub = mid; }
方法二:
while (ub - lb < eps) { // eps = 0.00001 double mid = (lb + ub) / 2; if (C(mid)) lb = mid; else ub = mid; }
POJ 2456
给出N个数字, 从中挑选M个, 使得挑选出来的数字之间的差的最小值最大化.
C(x)表示可以挑出M个数字使得最小差不小于x
然后对x进行二分查找就可以了.