Median POJ - 3579 二分

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100000+5;
int n,a[maxn],m;
bool check(int d)
{
	int cnt=0;
	for(int i = 0; i < n; i ++)
		cnt+= (upper_bound(a+i,a+n,a[i]+d)-1-(a+i));
	if(cnt>=m) 
		return 1;
	else  
		return 0;
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		int c = n*(n-1)/2;//一共多少个差 
		if(c%2==0) 
			m = c/2;
		else  
			m = c/2+1;
		for(int i=0; i<n; i++)
			scanf("%d",&a[i]);//输入n个数
		sort(a,a+n);
		int l = -1,r = a[n-1]-a[0];
		while(l<r)
		{
			int mid = (r+l)/2;
			if(check(mid))  
				r=mid;
			else  
				l=mid+1;
		}
		printf("%d\n",r);
	}
	return 0;
}
posted @ 2020-05-07 00:59  晴屿  阅读(68)  评论(0编辑  收藏  举报