题目描述
有 n 个申请人和 m 个空闲的公寓。你的任务是分配公寓,以便尽可能多的申请人能够得到一个公寓。每个申请人都有一个期望的公寓大小,他们会接受任何大小与期望大小接近的公寓。
输入格式
从文件apartments.in 中读入数据。
第一行输入三个整数 n,m 和 k:申请人的数量,公寓的数量和最大允许差异。接下来一行包含 n 个整数 a1, a2, …, an:每个申请人的期望公寓大小。如果申请人的期望大小为 x,他或她将接受任何大小在 x-k 和 x+k 之间的公寓。最后一行包含 m 个整数 b1, b2, …, bm:每个公寓的大小。
输出格式
输出到文件 apartments.out 中。
输出一个整数:能够得到公寓的申请人的数量。
样例
Input 1
4 3 5 60 45 80 60 30 60 75
Output 1
2
数据范围
1 ≤ n, m ≤ 2 * 10^5, 0 ≤ k ≤ 10^9, 1 ≤ ai, bi ≤ 10^9
样例解释
对于第一个测试样例,申请人 1 和申请人 3 可以得到一个公寓,所以输出为 2。
我已通过阳历样例
在以下附上源代码:
#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma G++ optimize(2)
using namespace std;
int n,m,k;
int a[200010],b[200010];
int vis[200010];
int main(){
freopen("apartments.in","r",stdin);
freopen("apartments.out","w",stdout);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
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 + n + 1);
int sum = 0;
for (int j = 1; j <= n; j++){
for (int i = 1; i <= m; i++){
if (vis[i] == 0){
if (a[j] - k <= b[i]){
if (a[j] + k >= b[i]){
sum++;
vis[i] == 1;
break;
}
} else{
vis[i] = 1;
}
}
}
}
cout << sum;
return 0;
}
哪位大佬 救救我 ?