计算每组数字差的绝对值的中位数
http://poj.org/problem?id=3579
题意很简单
如果直接计算差值 n方一定会炸
这里采用二分的方法
首先 计算二分的范围
然后 对每次的mid 相当于计算每个数的贡献 在每个数a[i] 到 a[i]+mid 有多少个数
n个数 一共有n*(n+1)/2个组合 在中间就是(n*(n+1)/2)+1或者n*(n+1)/2
然后看是不是中间那个就可以了
#include <iostream> #include<string.h> #include<algorithm> using namespace std; int a[100010]; int n,m; bool check(int mid) { int ans=0; for(int i=0;i<n;i++) { ans+=((upper_bound(a, a + n, a[i] + mid) - a)-1-i); } return ans>=m; } int main() { while(cin>>n) { m=n*(n-1)/2+1; m=m/2; if(n==0) break; memset(a,0,sizeof(a)); for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); int l=0,r=a[n-1]-a[0]; while(l<=r) { int mid=(l+r)/2; if(check(mid)) r=mid-1; else l=mid+1; } if(check(r)) printf("%d\n",r); else printf("%d\n",l); } return 0; }
吾志所向
一往无前
愈挫愈奋
再接再励
——卓

浙公网安备 33010602011771号