POJ--3258 River Hopscotch(二分搜索/最大化最小值)

记录
10:23 2023-3-11

http://poj.org/problem?id=3259

二分法查找最大的可能解,检查x是否符合条件(当前这个位置上的值 - 前上一个选取位置的值 >= x)

注意的点:

  1. 使用了[begin, end) 的左闭右开区间,所以结果要begin - 1,end要从L+1开始算
点击查看代码
int L, N, M;
int rocks[50000 + 5];

bool C(int x) {
    int last = 0;
    int moveCount = 0;
    for(int i = 1; i <= N + 1; i++) {
        while(i <= N + 1 && rocks[i] - rocks[last] < x) {
            i++;
            moveCount++;
        }
        last = i;
    }
    if(moveCount > M) return false;
    return true;
}

int main() {
    scanf("%d%d%d", &L, &N, &M);
    rocks[0] = 0;
    rocks[N + 1] = L;
    for(int i = 1; i <= N; i++){
        scanf("%d", &rocks[i]);
    }
    sort(rocks, rocks + N + 1);
    // end从L+1开始
    int begin = 0, end = L + 1;
    // [)
    while(begin < end) {
        int mid = (begin + end) / 2;
        //能否让两个石头之间的距离大于mid
        if(C(mid)) {
            begin = mid + 1;
        } else {
            end = mid;
        }
    }
    printf("%d\n", begin - 1);
}
posted @ 2024-03-11 10:26  57one  阅读(14)  评论(0编辑  收藏  举报