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;
}

浙公网安备 33010602011771号