蒟蒻的一个问题

CPP 刷题王 2024-04-25 15:03:04 6

为啥

#include <bits/stdc++.h>
using namespace std;
int a[100010];
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", a + i);
    int q, k;
    scanf("%d", &q);
    while (q--) {
        scanf("%d", &k);
        int l = 1, r = n, mid;
        while (l < r) {
            mid = l + r >> 1;
            if (a[mid] < k)
                l = mid + 1;
            else
                r = mid;
        }
        if (abs(a[l] - k) < abs(a[l - 1] - k)) {
            printf("%d\n", a[l]);
        }

        else
            printf("%d\n", a[l - 1]);
    }
    return 0;
}

WA 了,但是全部改成 l + r + 1 >> 1 的方法就对了?

{{ vote && vote.total.up }}

共 3 条回复

Wind_Rises 砂糖老师

其实并不是你这样写错了,在二分左端点的时候不会出现死循环的情况,所以这个1加不加都无所谓。但是你在 abs(a[l] - k) < abs(a[l - 1] - k) 这个条件的时候忽略了一点,就是当l==1的时候,你这个会越界。所以只要在这里加一个 l==1|| 就可以过了。

CPP 刷题王

@root

root 站长

插眼,等后面看