原题链接:原题连接
题目大意:给n个数,输出这些数的所有差值的绝对值的中位数。
题目解法:同样二分查找,因为是求差值绝对值的中位数,所以可以默认是大的数减去小的数,所以可以先对所有的数按从大到小排序,然后在0~a[n-1]-a[0]进行二分,每次通过判断小于等于a[i]+mid数的个数再进行调整。这里用到了upper_bound函数,具体功能介绍见第一篇文章。
题目代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
int n,temp;
int number[100050];
int compare(const void* a,const void* b)
{
return *(int *)a-*(int *)b;
}
int judge(int x)
{
int num=0,i=0;
for(i=0;i<n;i++)
{
int t=0;
t=upper_bound(number,number+n,number[i]+x);
num+=t;
}
if(num>=temp)
{
return 1;
}else
{
return 0;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int left=0,right=0,mid=0,ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&number[i]);
}
qsort(number,n,sizeof(number[0]),compare);
temp=ceil((double)n*(n-1)/4.0);
left=0,right=number[n-1]-number[0];
while(left<=right)
{
mid=(left+right)/2;
if(judge(mid))
{
ans=mid;
right=mid-1;
}else
{
left=mid+1
}
}
printf("%d\n",ans);
}
return 0;
}
努力努力再努力x