不知道第几部分:
二分:
1:最小值最大化
//最小值最大化 int le = 1, ri = n, mid, ans; while (le <= ri) { mid = (le + ri) / 2; if (check(mid)) ans = mid, le = mid + 1; else ri = mid - 1; } ans
2:最大值最小化(差不多的代码)
//最大值最小化 int le = 1, ri = n, mid, ans; while (le <= ri) { mid = (le + ri) / 2; if (check(mid)) ans = mid, ri = mid - 1; else le = mid + 1; } ans
3:求实数(依然差不多的代码)
//求实数 double le = 1, ri = n, mid; for (int i = 1; i <= 50; i++) { mid = (le + ri) / 2; if (check(mid)) ri = mid; else le = mid; } ans
三分:一个~神奇~的算法
//三分 le = 0; ri = min(i - 1, n - i); while (le + 1 <= ri) { w1 = (ri - le) / 3 + le; w2 = ri - (ri - le) / 3; v1 = make(i, w1); v2 = make(i, w2); if (v1 > v2) ri = w2 - 1; else le = w1 + 1; } le