这题可用二分解,暴力的O(n^2)肯定是必挂的,对可能的结果值做二分,然后check这个值是否符合条件
#include<cstdio>
#include<algorithm>
using namespace std;
namespace
{
typedef long long ll;
int N, dat[100000];
ll K;
bool check(int num)
{
ll count = 0;
for (int i = 0; i < N; i++)
{
int index = upper_bound(dat, dat + N, dat[i] + num) - dat;
count += index - i - 1;
}
return count >= K;
}
void solve()
{
sort(dat, dat + N);
ll total = 1LL * N * (N - 1) / 2;
K = total & 1 ? total / 2 + 1 : total / 2;
int ub = dat[N - 1] - dat[0];
if (ub == 0)
puts("0");
else
{
int lb = 0, mid;
ub++;
while (lb + 1 < ub)
{
mid = (lb + ub) / 2;
if (check(mid))
ub = mid;
else
lb = mid;
}
printf("%d\n", ub);
}
}
}
int main()
{
while (scanf("%d", &N) != EOF)
{
for (int i = 0; i < N; i++)
scanf("%d", &dat[i]);
solve();
}
return 0;
}