#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-04-10 17:14:40 发布