为啥
#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
的方法就对了?
共 3 条回复
其实并不是你这样写错了,在二分左端点的时候不会出现死循环的情况,所以这个1加不加都无所谓。但是你在 abs(a[l] - k) < abs(a[l - 1] - k) 这个条件的时候忽略了一点,就是当l==1的时候,你这个会越界。所以只要在这里加一个 l==1|| 就可以过了。
@root ?
插眼,等后面看