poj3579
普通的n^2方法必定超时。
对a排序后,与a_i的差大于mid(也就是某个数大于a_i + mid)的那些数的个数如果小于N / 2的话,说明mid太大了。
//272k, 594ms
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_N = 100005;
int n, m;
int a[MAX_N];
bool C(int val) {
int count = 0;
for(int i=0; i<n; i++) {
count += upper_bound(a+i, a+n, val+a[i]) - 1 - (a + i);
}
return count >= m;
}
int main() {
freopen("in.txt", "r", stdin);
while(~scanf("%d", &n)) {
for(int i=0; i<n; i++) scanf("%d", &a[i]);
sort(a, a+n);
int c = n * (n - 1) / 2;
if(c % 2 == 0) m = c / 2;
else m = c / 2 + 1;
int l = 0, r = a[n-1] - a[0];
while(l < r) {
int mid = l + (r - l) / 2;
if(C(mid))
r = mid ;
else
l = mid + 1;
}
printf("%d\n", r);
}
fclose(stdin);
return 0;
}