AT_yahoo_procon2017_final_b 学习笔记

二分练习题

进入正题

题意

给定两个数组 \(a\)\(b\),要求在这两个数组中选出 \(k\) 个数,使得两两差的最大值最小,输出这个最小值。

二分这件事大家都不陌生,就是填一下 check 函数而已,排序之后差最小这件事就不用我来说了吧。

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005

int n, m, k;

int a[maxn], b[maxn];

bool check(int mid) {
    int sum = 0, i = 1, j = 1;
    while (i <= n && j <= m) {
        if (abs(a[i] - b[j]) <= mid)
            sum++, i++, j++;
        else if (a[i] > b[j])
            j++;
        else 
            i++;
    } // 模拟两队
    return sum >= k;
}

int main() {
    cin >> n >> m >> k;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= m; i++)
        cin >> b[i];
    sort(a + 1, a + n + 1);
    sort(b + 1, b + m + 1); // 排序
    int l = 0, r = 1e9;
    while (l < r) {
        int mid = (l + r) >> 1;
        if (check(mid))
            r = mid;
        else 
            l = mid + 1;
    } // 板子
    cout << l; // 愉快输出
    return 0;
}
posted @ 2026-02-02 18:47  constexpr_ll  阅读(0)  评论(0)    收藏  举报