poj 2579 中位数问题 查找第K大的值

题意:对列数X计算∣Xi  Xj∣组成新数列的中位数。

思路:双重二分搜索

  1. 对x排序
  2. 如果某数大于 mid+xi 说明在mid后面,这些数的个数小于 n/2 的话说明这个中位数 mid 太大 反之太小 
  3. 对x 搜索 ,直接用lower_bound实现

解决问题的代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define maxn 100000
int x[maxn];
int n, cn = 0;
bool solve(int mid)
{
        int big = 0;
        for (int i = 0; i < n; i++)
        {
               big += n - (lower_bound(x + i, x + n, x[i] + mid) - x);
        }
        return big > cn/ 2;
}
int main()
{
        while (scanf("%d", &n) == 1)
        {
               for (int i = 0; i < n; i++)
                       scanf("%d", &x[i]);
               sort(x, x + n);
               cn = n * (n - 1) / 2;
               int lb = 0, ub = *max_element(x, x + n) - *min_element(x, x + n) + 1;
               while (ub - lb > 1)
               {
                       int mid = (ub + lb) / 2;
                       if (solve(mid)) lb = mid;
                       else ub = mid;
               }
               printf("%d\n", lb);
        }
        return 0;
}

 

posted @ 2018-08-04 16:01  徐小晋  阅读(274)  评论(0编辑  收藏  举报