poj 2579 中位数问题 查找第K大的值
题意:对列数X计算∣Xi – Xj∣组成新数列的中位数。
思路:双重二分搜索
- 对x排序
- 如果某数大于 mid+xi 说明在mid后面,这些数的个数小于 n/2 的话说明这个中位数 mid 太大 反之太小
- 对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; }
君子知命不惧,自当日日自新