AT_yahoo_procon2017_final_b题解
写在前面
一道不错的题目,建议评橙~黄。
题目大意
给定
题目分析
显然,本题可以二分答案:写一个 check 函数计算当最小值为
然后,就会有
-
找不出
K 组:说明mid 太小,令left = mid + 1 。 -
找的出
K 组:令right = mid 。
二分的思路清楚了,回顾一下二分模板,得到 while 的条件是
AC代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool check(int d, int K, const vector<int>& A, const vector<int>& B) {
int l = 0, r = 0;
while (l < A.size() && r < B.size()) { //类似双指针的做法
if (abs(A[l] - B[r]) <= d) {
K--;
l++;
r++;
} else if (A[l] > B[r]) {
l++;
} else {
r++;
}
}
return K <= 0;
}
int main() {
int N, M, K;
cin >> N >> M >> K;
vector<int> A(N), B(M);
for (int i = 0; i < N; ++i) {
cin >> A[i];
}
for (int i = 0; i < M; ++i) {
cin >> B[i];
}
sort(A.rbegin(), A.rend());
sort(B.rbegin(), B.rend());
int left = 0, right = 1e9;
while (left < right) {
int mid = left + (right - left) / 2;
if (check(mid, K, A, B)) {
right = mid;
} else {
left = mid + 1;
}
}
cout << left << endl;
return 0;
}