แนวคิด
สำหรับจำนวนเมืองที่กำหนด N ที่มีหมายเลขตั้งแต่ 0 ถึง N-1 และเมืองที่สถานีตั้งอยู่ หน้าที่ของเราคือกำหนดระยะทางสูงสุดระหว่างเมืองใดๆ และสถานีที่ใกล้ที่สุด ควรสังเกตว่าสามารถกำหนดเมืองที่มีสถานีในลำดับใดก็ได้
อินพุต
numOfCities = 6, stations = [2, 4]
ผลลัพธ์
2
อินพุต
numOfCities = 6, stations = [4]
ผลลัพธ์
4
-
รูปต่อไปนี้แสดงถึงตัวอย่างแรกที่มี 6 เมืองและเมืองที่มีสถานีที่เน้นด้วยสีเขียว ดังนั้น ในกรณีนี้ เมืองที่ไกลที่สุดจากสถานีที่ใกล้ที่สุดคือ 0 ที่ระยะห่าง 2 ดังนั้น ระยะทางสูงสุดคือ 1

-
ในตัวอย่างที่สอง เมืองที่ไกลที่สุดจากสถานีที่ใกล้ที่สุดคือ 0 ซึ่งเป็นระยะทาง 4 ดังนั้นระยะทางสูงสุดคือ 4

วิธีการ
มีสามกรณีที่เป็นไปได้ในปัญหานี้ -
-
กรณีแรกระบุว่าเมืองที่ไกลที่สุดอยู่ระหว่างสองสถานี
-
กรณีที่สองระบุว่าเมืองที่ไกลที่สุดจะอยู่ทางด้านซ้ายของสถานีแรกเมื่อใด
-
กรณีสุดท้ายระบุว่าเมืองที่ไกลที่สุดอยู่ทางด้านขวาของสถานีสุดท้ายเมื่อใด
อัลกอริทึมต่อไปนี้ถูกนำมาใช้เพื่อแก้ปัญหาข้างต้น -
-
เราเริ่มต้นอาร์เรย์บูลีนขนาด N (จำนวนเมือง) ด้วย "เท็จ" หลังจากนั้นให้ทำเครื่องหมายค่าของเมืองด้วยสถานีเป็น True
-
ต่อไปเราจะเริ่มต้นตัวแปร dist ด้วย 0 เราต้องเริ่มต้นตัวแปรอื่น maxDist ที่มีค่าซึ่งเหมือนกับเมืองแรกที่มีสถานี (ใช้สำหรับกรณีที่สอง)
-
เริ่มวนรอบเมืองทั้งหมดทีละเมือง
-
มีการสังเกตว่าถ้าเมืองปัจจุบันมีสถานีแล้วกำหนดสูงสุดของ (dist+1)//2 และ maxDist ให้กับ maxDist (ใช้สำหรับกรณีแรก) นอกจากนี้ กำหนด 0 ให้กับ dist.
-
มิฉะนั้น เพิ่ม dist.
-
สุดท้าย คืนค่าสูงสุดของ dist และ maxDist (ใช้สำหรับกรณีที่สาม)
ตัวอย่าง
// C++ program to calculate the maximum
// distance between any city
// and its nearest station
#include<bits/stdc++.h>
using namespace std;
// Shows function to compute the maximum
// distance between any city and its nearest station
int findMaxDistance(int numOfCities1,int station1[],int N){
// Used to initialize boolean list
bool hasStation[numOfCities1 + 1] = {false};
// Used to assign True to cities containing station
for (int city1 = 0; city1 < N; city1++){
hasStation[station1[city1]] = true;
}
int dist1 = 0;
int maxDist1 = INT_MAX;
for(int i = 0; i < N; i++){
maxDist1 = min(station1[i],maxDist1);
}
for (int city1 = 0; city1 < numOfCities1; city1++){
if (hasStation[city1] == true){
maxDist1 = max((dist1 + 1) / 2, maxDist1);
dist1 = 0;
}
else
dist1 += 1;
}
return max(maxDist1, dist1);
}
//Driver code
int main(){
int numOfCities1 = 6;
int station1[] = {2,4};
int N = sizeof(station1)/sizeof(station1[0]);
cout << "Max Distance:" << findMaxDistance(numOfCities1,
station1, N);
} ผลลัพธ์
Max Distance:2