解を仮定し可能か判定
L_iの紐N本から同じ長さの紐をK本切り出したときの最長の長さを求めよ。
評価関数:C(x) = xでK本以上切り出せるか
<=> C(x) = floor(L_i/x)の総和がK以上
bool C(double x) {
int num = 0;
for(int i=0; i<N; i++)
num += (int)(L[i] / x);
return num >= K; // >=であれば、少なくともK本は切り出せる
}後は上の評価関数を用いて二分探索する。100回くらい探索すれば解として十分な精度が得られる。
int lb = 0, ub = INF;
for(int i=0; i<100; i++) {
double mid = (lb + ub) / 2;
if(C(mid)) lb = mid; // もっと長く切り出せるか
else ub = mid; // 短くすべきか
}