这是一道很难的二分搜索题,稀里糊涂的就AC了还没有弄懂为什么….
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100000+5;
int x[maxn];
bool judge(int mid, int n, long long c) {
int cnt = 0;
for (int i = 0; i < n; i++) {
cnt += x + n - lower_bound(x + i + 1, x + n, x[i] + mid);
}
return cnt <= c / 2;
}
int main(int argc, char const *argv[]) {
int n;
while (scanf("%d", &n) == 1) {
long long c = n * (n - 1) / 2;
for (int i = 0; i < n; i++) {
scanf("%d", &x[i]);
}
sort(x, x + n);
int lb = 0;
int ub = x[n-1] - x[0];
while (ub - lb > 1) {
int mid = (lb + ub) / 2;
if (judge(mid, n, c)) {
ub = mid;
} else {
lb = mid;
}
}
printf("%d\n", lb);
}
return 0;
}
或者
while (ub > lb) {
int mid = (lb + ub) / 2;
if (judge(mid, n, c)) {
ub = mid;
} else {
lb = mid + 1;
}
}
printf("%d\n", lb-1);
可答案为什么是lb呢?

1895

被折叠的 条评论
为什么被折叠?



