ধরুন আমাদের কাছে সংখ্যার একটি অ্যারে আছে, A-তে i-তম সংখ্যা হল সেই অবস্থান যেখানে একটি দ্বীপ রয়েছে, এবং আরেকটি পূর্ণসংখ্যা k দেওয়া হয়েছে (1 ≤ k
সুতরাং, যদি ইনপুটটি হয় A =[7, 20, 41, 48], k =2, তাহলে আউটপুট হবে 28, কারণ শেষ দ্বীপে পৌঁছানোর দুটি উপায় আছে 7 থেকে 20 থেকে 48, এখানে সর্বাধিক দূরত্ব যেকোনো দুটি পরপর দ্বীপের মধ্যে 48 থেকে 20 অর্থাৎ 28। এবং 7 থেকে 41 থেকে 48 এখানে যে কোনো দুটি পরপর দ্বীপের মধ্যে সর্বোচ্চ দূরত্ব হল 41 থেকে 7 এর মধ্যে অর্থাৎ 34। সুতরাং, 28 এবং 34-এর সর্বনিম্ন 28।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি ফাংশন সংজ্ঞায়িত করুন isPossible()। এটি arr,dist, k
লাগবে -
n :=arr এর আকার
-
অনুরোধ :=0
-
বর্তমান :=0
-
আগের :=0
-
0 থেকে n রেঞ্জের জন্য, করুন
-
যদিও বর্তমান n এবং (arr[বর্তমান] - arr[পূর্ববর্তী]) <=dist, do
এর মত নয়-
বর্তমান :=বর্তমান + 1
-
-
req :=req + 1
-
যদি বর্তমান n এর মত হয়, তাহলে
-
লুপ থেকে বেরিয়ে আসুন
-
-
পূর্ববর্তী :=বর্তমান - 1
-
-
যদি কারেন্ট n এর মত না হয়, তাহলে
-
রিটার্ন ফলস
-
-
যদি req <=k, তাহলে
-
রিটার্ন ট্রু
-
-
রিটার্ন ফলস
-
প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
-
n :=arr এর আকার
-
বাম :=0
-
ডানে :=অ্যারের শেষ উপাদান
-
উত্তর :=0
-
যখন বাম -=ডান, কর
-
মধ্য :=(বাম + ডান) / 2;
-
যদি isPossible(arr, mid, k) অ-শূন্য হয়, তাহলে
-
উত্তর :=মধ্য
-
ডান:=মধ্য - 1
-
-
অন্যথায়,
-
বাম :=মধ্য + 1
-
-
-
উত্তর ফেরত দিন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
def isPossible(arr,dist, k) : n = len(arr) req = 0 current = 0 previous = 0 for i in range(0, n): while (current != n and (arr[current] - arr[previous]) <= dist): current += 1 req += 1 if (current == n): break previous = current - 1 if (current != n): return False if (req <= k): return True return False def minimum_distance(arr, k): n = len(arr) left = 0 right = arr[-1] ans = 0 while (left <= right): mid = (left + right) // 2; if (isPossible(arr, mid, k)): ans = mid right = mid - 1 else: left = mid + 1 return ans arr = [7, 20, 41, 48] k = 2 print(minimum_distance(arr, k))
ইনপুট
[7, 20, 41, 48] , 2
আউটপুট
28