โจทย์
ได้รับอาร์เรย์สองอันขนาดเท่ากัน N สร้างคู่ (Pair) จำนวนมากที่สุดโดยใช้องค์ประกอบ หนึ่งจากอาร์เรย์แรก และอีกหนึ่งจากอาร์เรย์ที่สอง โดยที่องค์ประกอบจากแต่ละอาร์เรย์ถูกใช้ได้สูงสุด 1 ครั้ง และค่าสัมบูรณ์ของความต่างระหว่างองค์ประกอบที่เลือกต้องน้อยกว่าหรือเท่ากับ K ที่กำหนด
ตัวอย่าง
ถ้าอินพุตคือ
arr1[] = {3, 4, 5, 2, 1}
arr2[] = {6, 5, 4, 7, 15}
และ k = 3 แล้วสามารถสร้าง 4 คู่ที่ความต่างสัมบูรณ์ ≤ 3 ได้ดังนี้
(1, 4), (2, 5), (3, 6), (4, 7)
อัลกอริทึม
ใช้วิธี Recursive/Greedy เพื่อแก้ปัญหานี้
- จัดเรียงทั้งสองอาร์เรย์
- เปรียบเทียบแต่ละองค์ประกอบของอาร์เรย์แรกกับอาร์เรย์ที่สองเพื่อหาคู่ที่เป็นไปได้
- ต่อไปตรวจสอบคู่ถัดไปสำหรับองค์ประกอบถัดไปของอาร์เรย์แรก
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
int getMaxUniquePairs(int* arr1, int* arr2, int n, int k) {
sort(arr1, arr1 + n);
sort(arr2, arr2 + n);
bool visited[n];
memset(visited, false, sizeof(visited));
int pairCnt = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (abs(arr1[i] - arr2[j]) <= k && visited[j] == false) {
++pairCnt;
visited[j] = true;
break;
}
}
}
return pairCnt;
}
int main() {
int arr1[] = {3, 4, 5, 2, 1};
int arr2[] = {6, 5, 4, 7, 15};
int n = sizeof(arr1) / sizeof(arr1[0]);
int k = 3;
cout << "Maximum unique pairs = " << getMaxUniquePairs(arr1, arr2, n, k) << endl;
return 0;
}
ผลลัพธ์
Maximum unique pairs = 4