#include<stdio.h>
#define N 100000+16
int d[N];
int n;
void qsort(int a[],int l,int r)//快速排序
{
int i,j,x;
if(l<r)
{
i=l;
j=r;
x=a[i];
while(i<j)
{
while(i<j&&a[j]>x)
j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<=x)
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=x;
qsort(a,l,i-1);
qsort(a,i+1,r);
}
}
int main(void)
{
int s,l,r,m,i,j,ans;
while(~scanf("%d",&n))
{
s=(n-1)*n/4;
if(((n-1)*n/2)&1)
s++;
for(i=1;i<=n;i++)
scanf("%d",&d[i]);
qsort(d,1,n);
l=0;r=d[n]-d[1];
while(l<r)
{
ans=0;
m=(l+r)/2;
j=1;
for(i=2;i<=n;i++)//尺取法
{
while(d[i]-d[j]>m)
j++;
ans+=(i-j);
}
if(ans<s)
l=m+1;
else
r=m;
}
printf("%d\n",l);
}
}
poj 3579 二分加尺取法
最新推荐文章于 2020-07-20 22:12:23 发布