Apartments
題目
有 位客人和 間公寓。你的任務是為這些客人分配公寓,使得盡可能多的客人都分配到一間公寓。
每個客人都有偏好的公寓大小,客人只會接受任何大小足夠接近偏好(誤差值不大於 )的公寓。
輸入
- 第一行有三個正整數 、、。(,)
- 代表客人數量。
- 代表公寓數量。
- 代表容許的最大誤差值。
- 第二行有 個正整數 ,分別代表各個客人的偏好大小。()
- 若某個客人偏好的大小是 ,那他只會接受大小在 與 之間的公寓。
- 第三行有 個正整數 ,分別代表各間公寓的大小。()
輸出
輸出共有幾個客人可以分配到公寓。
範例測資
Input:
4 3 5
60 45 80 60
30 60 75
Output:
2
第一位客人沒有適合的公寓,沒有公寓的大小在 之間
第二位客人選擇 的公寓,因為他離 最近,且差值小於等於
第三位客人選擇 的公寓,因為他離 最近,且差值小於等於
想法 : 雙指針
我們先將 與 兩個陣列排序後,運用雙指針的技巧控制兩個索 引值 與 。當 可以與 配對時(也就是當 ),我們就將 與 各遞增 ;如果不能配對時,我們則判斷如果 就將 遞增 ,否則就將 遞增 ,完成上述操作後就可以繼續進行下一組配對。
範例程式碼
C++ 範例
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int a[maxn], b[maxn];
int main() {
int n, m, k;
cin >> n >> m >> k;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i< m; i++)
cin >> b[i];
sort(a, a+n);
sort(b, b+m);
int l = 0, r = 0, ans = 0;
while (l < n && r < m) {
if (abs(a[l]-b[r]) <= k) {
l++;
r++;
ans++;
} else {
if (a[l] > b[r])
r++;
else
l++;
}
}
cout << ans;
}