ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ขององค์ประกอบ n รายการที่แสดงถึงตำแหน่งดัชนี N และมีแม่เหล็ก C งานของเราคือการพิมพ์แม่เหล็กทั้งหมดเหล่านี้ในลักษณะที่ระยะห่างระหว่างแม่เหล็กที่อยู่ใกล้ที่สุดสองตัวนั้นใหญ่ที่สุด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล − array ={ 1, 4, 6,12, 28, 44 } C =4
ผลผลิต − 11
เพื่อแก้ปัญหานี้ เราจะใช้การค้นหาแบบไบนารีในระยะทางสูงสุด เราจะกำหนดระยะสูงสุดแล้ววางแม่เหล็กทั้งหมดระหว่าง 0 ถึงระยะทางสูงสุดได้
จากนั้นเราจะใช้การค้นหาแบบไบนารีเพื่อค้นหาค่าตรงกลางและตรวจสอบว่าสามารถวางแม่เหล็กได้หรือไม่ ถ้าใช่ ให้วางแม่เหล็กและถือว่าระยะกลางเป็นระยะห่างสูงสุด แล้วทำตามขั้นตอนเดียวกัน
ตัวอย่าง
โปรแกรมแสดงการใช้งานโซลูชันของเรา
#include <iostream> using namespace std; bool canPlace(int arr[], int n, int C, int mid){ int magnet = 1, currPosition = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] - currPosition >= mid) { magnet++; currPosition = arr[i]; if (magnet == C) return true; } } return false; } int minDistMax(int n, int C, int arr[]){ int lo, hi, mid, ans; lo = 0; hi = arr[n - 1]; ans = 0; while (lo <= hi) { mid = (lo + hi) / 2; if (!canPlace(arr, n, C, mid)) hi = mid - 1; else { ans = max(ans, mid); lo = mid + 1; } } return ans; } int main(){ int C = 4; int arr[] = { 1, 4, 6,12, 28, 44 }; int n = sizeof(arr) / sizeof(arr[0]); cout<<"Maximised Minimum distance is "<<minDistMax(n, C, arr); return 0; }
ผลลัพธ์
Maximised Minimum distance is 11