मान लीजिए कि हमारे पास घरों नामक एक सरणी है और एक और मूल्य k है। यहां मकान [i] सड़क के किनारे ith घर के स्थान का प्रतिनिधित्व करते हैं, हमें गली में k मेलबॉक्स आवंटित करने होंगे, और प्रत्येक घर और उसके निकटतम मेलबॉक्स के बीच न्यूनतम कुल दूरी ज्ञात करनी होगी।
इसलिए, यदि इनपुट घरों की तरह है =[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.
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
सूची घरों को क्रमबद्ध करें
-
उपयोग() फ़ंक्शन को परिभाषित करें। यह idx, n, k
. लेगा -
अगर k 1 के समान है, तो
-
कोर:=मकान [(n + idx)/2 का भागफल]
-
[|घरों[i] - कोर| . के सभी तत्वों का रिटर्न योग idx से n तक की श्रेणी में प्रत्येक i के लिए])
-
-
परिणाम:=अनंत
-
idx से n तक की श्रेणी में i के लिए, करें
-
अगर n - i
-
लूप से बाहर आएं
-
-
परिणाम:=न्यूनतम परिणाम और उपयोग (idx, i, 1) + उपयोग (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