#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-03-30 12:09:58 发布
本文介绍了一种结合快速排序与尺取法求解特定问题的算法实现。通过定义问题背景,给出完整的C语言代码示例,展示了如何利用快速排序进行数组排序,并采用尺取法在已排序数组中寻找满足条件的最小距离。
541

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



