二分

二分

// 查找第一个满足条件的元素
int l = 1, r = n;
while (l < r) {
    int mid = l + ((r - l) >> 1);  // 防溢出,等价于 (l + r) / 2
    if (check(mid)) {
        r = mid;    // 满足条件,往左找更小的
    } else {
        l = mid + 1; // 不满足条件,往右找
    }
}
cout << l << endl;  // 此时 l == r,是第一个满足条件的值
// 查找最后一个满足条件的元素
int l = 1, r = n;
while (l < r) {
    int mid = l + ((r - l + 1) >> 1);  // 注意这里要 +1
    if (check(mid)) {
        l = mid;    // 满足条件,往右找更大的
    } else {
        r = mid - 1; // 不满足条件,往左找
    }
}
cout << l << endl;  // 此时 l == r,是最后一个满足条件的值
posted @ 2025-11-26 13:54  10mbps_十兆網路  阅读(0)  评论(0)    收藏  举报