ধরুন আমাদের একটি অ্যারে আছে যার নাম হাউসস এবং আরেকটি মান আছে k। এখানে বাড়িগুলি[i] একটি রাস্তার পাশে ith বাড়ির অবস্থানকে প্রতিনিধিত্ব করে, আমাদের রাস্তায় k মেলবক্সগুলি বরাদ্দ করতে হবে এবং প্রতিটি বাড়ি এবং এর নিকটতম মেলবক্সের মধ্যে সর্বনিম্ন মোট দূরত্ব খুঁজে বের করতে হবে৷
সুতরাং, যদি ইনপুটটি houses =[6,7,9,16,22] k =2 এর মত হয়, তাহলে আউটপুট হবে 9 কারণ যদি আমরা 7 এবং 18 এ মেইলবক্স রাখি, তাহলে প্রতিটি বাড়ি থেকে সর্বনিম্ন মোট দূরত্ব হবে |6 -7|+|7-7|+|9-7|+|16- 18|+|22-18| =1+0+2+2+4 =9.
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
তালিকা ঘর সাজান
-
একটি ফাংশন util() সংজ্ঞায়িত করুন। এটি idx, n, k
লাগবে -
k যদি 1 এর মত হয়, তাহলে
-
কোর :=ঘর [(n + idx)/2]
এর ভাগফল -
[|হাউস[i] - কোর| এর সমস্ত উপাদানের যোগফল ফেরত দিন আইডিএক্স থেকে n])
পরিসরের প্রতিটি i এর জন্য
-
-
ফলাফল:=অসীম
-
আইডিএক্স থেকে n রেঞ্জের জন্য, করুন
-
যদি n - i
-
লুপ থেকে বেরিয়ে আসুন
-
-
ফলাফল :=ন্যূনতম ফলাফল এবং util(idx, i, 1) + util(i+1, n, k - 1)
-
-
ফেরত ফলাফল
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন:
-
রিটার্ন ইউটিল (0, বাড়ির আকার - 1, কে)
উদাহরণ
আসুন আরও ভালভাবে বোঝার জন্য নিম্নলিখিত বাস্তবায়ন দেখি
def solve(houses, k): houses.sort() def util(idx, n, k): if k == 1: core = houses[(n + idx) // 2] return sum([abs(houses[i] - core) for i in range(idx, n + 1)]) result = float('inf') for i in range(idx, n + 1): if n - i < k - 1: break result = min(result, util(idx, i, 1) + util(i+1, n, k - 1)) return result return util(0, len(houses) - 1, k) houses = [6,7,9,16,22] k = 2 print(solve(houses, k))
ইনপুট
[6,7,9,16,22], 2
আউটপুট
9