نظرا لمجموعة من الحجم ن المهمة هي جعل قيمة جميع العناصر متساوية الحد الأدنى من التكلفة . تكلفة تغيير القيمة من x إلى y هي القيمة المطلقة (س - ص).
أمثلة :
مدخل: آر [] = [1 100 101]
الإخراج : 100
توضيح: يمكننا تغيير جميع قيمها إلى 100 بأقل تكلفة
|1 - 100| + |100 - 100| + |101 - 100| = 100مدخل : آر[] = [4 6]
الإخراج : 2
توضيح: يمكننا تغيير جميع قيمها إلى 5 بأقل تكلفة
|4 - 5| + |5 - 6| = 2مدخل: آر[] = [5 5 5 5]
الإخراج:
توضيح: جميع القيم متساوية بالفعل.
[نهج ساذج] استخدام حلقتين متداخلتين - وقت O(n^2) ومساحة O(1)
C++يرجى ملاحظة أن إجابتنا يمكن أن تكون دائمًا إحدى قيم المصفوفة. حتى في المثال الثاني أعلاه يمكننا بدلاً من ذلك جعل كليهما 4 أو كليهما 6 بنفس التكلفة.
تتمثل الفكرة في اعتبار كل قيمة في المصفوفة كقيمة مستهدفة محتملة ثم حساب التكلفة الإجمالية لتحويل جميع العناصر الأخرى إلى تلك القيمة المستهدفة. ومن خلال التحقق من جميع القيم المستهدفة المحتملة، يمكننا العثور على القيمة التي تؤدي إلى الحد الأدنى من التكلفة الإجمالية للتحويل.
// C++ program to Make all array // elements equal with minimum cost #include using namespace std; // Function which finds the minimum // cost to make array elements equal int minCost(vector<int> &arr) { int n = arr.size(); int ans = INT_MAX; // Try each element as the target value for (int i = 0; i < n; i++) { int currentCost = 0; // Calculate cost of making all // elements equal to arr[i] for (int j = 0; j < n; j++) { currentCost += abs(arr[j] - arr[i]); } // Update minimum cost if current cost is lower ans = min(ans currentCost); } return ans; } int main() { vector<int> arr = {1 100 101}; cout << minCost(arr) << endl; return 0; }
Java // Java program to Make all array // elements equal with minimum cost import java.util.*; class GfG { // Function which finds the minimum // cost to make array elements equal static int minCost(int[] arr) { int n = arr.length; int ans = Integer.MAX_VALUE; // Try each element as the target value for (int i = 0; i < n; i++) { int currentCost = 0; // Calculate cost of making all // elements equal to arr[i] for (int j = 0; j < n; j++) { currentCost += Math.abs(arr[j] - arr[i]); } // Update minimum cost if current cost is lower ans = Math.min(ans currentCost); } return ans; } public static void main(String[] args) { int[] arr = {1 100 101}; System.out.println(minCost(arr)); } }
Python # Python program to Make all array # elements equal with minimum cost # Function which finds the minimum # cost to make array elements equal def minCost(arr): n = len(arr) ans = float('inf') # Try each element as the target value for i in range(n): currentCost = 0 # Calculate cost of making all # elements equal to arr[i] for j in range(n): currentCost += abs(arr[j] - arr[i]) # Update minimum cost if current cost is lower ans = min(ans currentCost) return ans if __name__ == '__main__': arr = [1 100 101] print(minCost(arr))
C# // C# program to Make all array // elements equal with minimum cost using System; class GfG { // Function which finds the minimum // cost to make array elements equal static int minCost(int[] arr) { int n = arr.Length; int ans = int.MaxValue; // Try each element as the target value for (int i = 0; i < n; i++) { int currentCost = 0; // Calculate cost of making all // elements equal to arr[i] for (int j = 0; j < n; j++) { currentCost += Math.Abs(arr[j] - arr[i]); } // Update minimum cost if current cost is lower ans = Math.Min(ans currentCost); } return ans; } static void Main() { int[] arr = {1 100 101}; Console.WriteLine(minCost(arr)); } }
JavaScript // JavaScript program to Make all array // elements equal with minimum cost // Function which finds the minimum // cost to make array elements equal function minCost(arr) { let n = arr.length; let ans = Number.MAX_SAFE_INTEGER; // Try each element as the target value for (let i = 0; i < n; i++) { let currentCost = 0; // Calculate cost of making all // elements equal to arr[i] for (let j = 0; j < n; j++) { currentCost += Math.abs(arr[j] - arr[i]); } // Update minimum cost if current cost is lower ans = Math.min(ans currentCost); } return ans; } let arr = [1 100 101]; console.log(minCost(arr));
الإخراج
100
[النهج المتوقع - 1] استخدام البحث الثنائي - وقت O(n Log (Range)) ومسافة O(1)
تتمثل الفكرة في استخدام البحث الثنائي للعثور بكفاءة على القيمة المثلى التي يجب تحويل جميع عناصر المصفوفة إليها. نظرًا لأن دالة التكلفة الإجمالية تشكل منحنى محدبًا (يتناقص أولاً ثم يتزايد) عبر نطاق القيم المحتملة، فيمكننا استخدام البحث الثنائي لتحديد النقطة الدنيا لهذا المنحنى من خلال مقارنة التكلفة عند نقطة المنتصف مع التكلفة عند نقطة المنتصف ناقص واحدة والتي تخبرنا عن الاتجاه الذي يجب البحث فيه أكثر.
نهج خطوة بخطوة:
- ابحث عن الحد الأدنى والحد الأقصى للقيم في المصفوفة لإنشاء نطاق البحث
- استخدم البحث الثنائي بين الحد الأدنى والحد الأقصى للقيم لتحديد القيمة المستهدفة المثلى
- لكل قيمة تجريبية، قم بحساب التكلفة الإجمالية لتحويل كافة عناصر المصفوفة إلى تلك القيمة
- قارن التكلفة عند نقطة المنتصف الحالية بالتكلفة عند نقطة المنتصف ناقص واحد لتحديد اتجاه البحث
- استمر في تضييق نطاق البحث حتى تجد تكوين الحد الأدنى للتكلفة
// C++ program to Make all array // elements equal with minimum cost #include using namespace std; // Function to find the cost of changing // array values to mid. int findCost(vector<int> &arr int mid) { int n = arr.size(); int ans = 0; for (int i=0; i<n; i++) { ans += abs(arr[i] - mid); } return ans; } // Function which finds the minimum cost // to make array elements equal. int minCost(vector<int> &arr) { int n = arr.size(); int mini = INT_MAX maxi = INT_MIN; // Find the minimum and maximum value. for (int i=0; i<n; i++) { mini = min(mini arr[i]); maxi = max(maxi arr[i]); } int s = mini e = maxi; int ans = INT_MAX; while (s <= e) { int mid = s + (e-s)/2; int cost1 = findCost(arr mid); int cost2 = findCost(arr mid-1); if (cost1 < cost2) { ans = cost1; s = mid + 1; } else { e = mid - 1; } } return ans; } int main() { vector<int> arr = {1 100 101}; cout << minCost(arr); return 0; }
Java // Java program to Make all array // elements equal with minimum cost import java.util.*; class GfG { // Function to find the cost of changing // array values to mid. static int findCost(int[] arr int mid) { int n = arr.length; int ans = 0; for (int i = 0; i < n; i++) { ans += Math.abs(arr[i] - mid); } return ans; } // Function which finds the minimum cost // to make array elements equal. static int minCost(int[] arr) { int n = arr.length; int mini = Integer.MAX_VALUE maxi = Integer.MIN_VALUE; // Find the minimum and maximum value. for (int i = 0; i < n; i++) { mini = Math.min(mini arr[i]); maxi = Math.max(maxi arr[i]); } int s = mini e = maxi; int ans = Integer.MAX_VALUE; while (s <= e) { int mid = s + (e - s) / 2; int cost1 = findCost(arr mid); int cost2 = findCost(arr mid - 1); if (cost1 < cost2) { ans = cost1; s = mid + 1; } else { e = mid - 1; } } return ans; } public static void main(String[] args) { int[] arr = {1 100 101}; System.out.println(minCost(arr)); } }
Python # Python program to Make all array # elements equal with minimum cost # Function to find the cost of changing # array values to mid. def findCost(arr mid): n = len(arr) ans = 0 for i in range(n): ans += abs(arr[i] - mid) return ans # Function which finds the minimum cost # to make array elements equal. def minCost(arr): n = len(arr) mini = float('inf') maxi = float('-inf') # Find the minimum and maximum value. for i in range(n): mini = min(mini arr[i]) maxi = max(maxi arr[i]) s = mini e = maxi ans = float('inf') while s <= e: mid = s + (e - s) // 2 cost1 = findCost(arr mid) cost2 = findCost(arr mid - 1) if cost1 < cost2: ans = cost1 s = mid + 1 else: e = mid - 1 return ans if __name__ == '__main__': arr = [1 100 101] print(minCost(arr))
C# // C# program to Make all array // elements equal with minimum cost using System; class GfG { // Function to find the cost of changing // array values to mid. static int findCost(int[] arr int mid) { int n = arr.Length; int ans = 0; for (int i = 0; i < n; i++) { ans += Math.Abs(arr[i] - mid); } return ans; } // Function which finds the minimum cost // to make array elements equal. static int minCost(int[] arr) { int n = arr.Length; int mini = int.MaxValue maxi = int.MinValue; // Find the minimum and maximum value. for (int i = 0; i < n; i++) { mini = Math.Min(mini arr[i]); maxi = Math.Max(maxi arr[i]); } int s = mini e = maxi; int ans = int.MaxValue; while (s <= e) { int mid = s + (e - s) / 2; int cost1 = findCost(arr mid); int cost2 = findCost(arr mid - 1); if (cost1 < cost2) { ans = cost1; s = mid + 1; } else { e = mid - 1; } } return ans; } static void Main() { int[] arr = {1 100 101}; Console.WriteLine(minCost(arr)); } }
JavaScript // JavaScript program to Make all array // elements equal with minimum cost // Function to find the cost of changing // array values to mid. function findCost(arr mid) { let n = arr.length; let ans = 0; for (let i = 0; i < n; i++) { ans += Math.abs(arr[i] - mid); } return ans; } // Function which finds the minimum cost // to make array elements equal. function minCost(arr) { let n = arr.length; let mini = Number.MAX_SAFE_INTEGER maxi = Number.MIN_SAFE_INTEGER; // Find the minimum and maximum value. for (let i = 0; i < n; i++) { mini = Math.min(mini arr[i]); maxi = Math.max(maxi arr[i]); } let s = mini e = maxi; let ans = Number.MAX_SAFE_INTEGER; while (s <= e) { let mid = Math.floor(s + (e - s) / 2); let cost1 = findCost(arr mid); let cost2 = findCost(arr mid - 1); if (cost1 < cost2) { ans = cost1; s = mid + 1; } else { e = mid - 1; } } return ans; } let arr = [1 100 101]; console.log(minCost(arr));
الإخراج
100
[النهج المتوقع - 2] استخدام الفرز - الوقت O(n Log n) والمسافة O(1)
تتمثل الفكرة في العثور على القيمة المثلى التي يجب أن تتساوى بها جميع العناصر والتي يجب أن تكون أحد عناصر المصفوفة الموجودة. من خلال فرز المصفوفة أولاً ثم تكرار كل عنصر كقيمة مستهدفة محتملة، نحسب تكلفة تحويل جميع العناصر الأخرى إلى تلك القيمة عن طريق تتبع مجموع العناصر إلى يسار ويمين الموضع الحالي بكفاءة.
نهج خطوة بخطوة:
- فرز المصفوفة لمعالجة العناصر بترتيب تصاعدي.
- لكل عنصر كقيمة مستهدفة محتملة، قم بحساب تكاليفين: رفع العناصر الأصغر للأعلى والعناصر الأكبر للأسفل.
- تتبع المبالغ اليمنى واليسرى لحساب هذه التكاليف بكفاءة في وقت ثابت لكل تكرار.
- رفع تكاليف العناصر الأصغر: (القيمة الحالية × عدد العناصر الأصغر) - (مجموع العناصر الأصغر)
- خفض تكاليف العناصر الأكبر: (مجموع العناصر الأكبر) - (القيمة الحالية × عدد العناصر الأكبر)
- قارن التكلفة الحالية مع الحد الأدنى من التكلفة.
// C++ program to Make all array // elements equal with minimum cost #include using namespace std; // Function which finds the minimum cost // to make array elements equal. int minCost(vector<int> &arr) { int n = arr.size(); // Sort the array sort(arr.begin() arr.end()); // Variable to store sum of elements // to the right side. int right = 0; for (int i=0; i<n; i++) { right += arr[i]; } int ans = INT_MAX; int left = 0; for (int i=0; i<n; i++) { // Remove the current element from right sum. right -= arr[i]; // Find cost of incrementing left side elements int leftCost = i * arr[i] - left; // Find cost of decrementing right side elements. int rightCost = right - (n-1-i) * arr[i]; ans = min(ans leftCost + rightCost); // Add current value to left sum left += arr[i]; } return ans; } int main() { vector<int> arr = {1 100 101}; cout << minCost(arr); return 0; }
Java // Java program to Make all array // elements equal with minimum cost import java.util.*; class GfG { // Function which finds the minimum cost // to make array elements equal. static int minCost(int[] arr) { int n = arr.length; // Sort the array Arrays.sort(arr); // Variable to store sum of elements // to the right side. int right = 0; for (int i = 0; i < n; i++) { right += arr[i]; } int ans = Integer.MAX_VALUE; int left = 0; for (int i = 0; i < n; i++) { // Remove the current element from right sum. right -= arr[i]; // Find cost of incrementing left side elements int leftCost = i * arr[i] - left; // Find cost of decrementing right side elements. int rightCost = right - (n - 1 - i) * arr[i]; ans = Math.min(ans leftCost + rightCost); // Add current value to left sum left += arr[i]; } return ans; } public static void main(String[] args) { int[] arr = {1 100 101}; System.out.println(minCost(arr)); } }
Python # Python program to Make all array # elements equal with minimum cost # Function which finds the minimum cost # to make array elements equal. def minCost(arr): n = len(arr) # Sort the array arr.sort() # Variable to store sum of elements # to the right side. right = sum(arr) ans = float('inf') left = 0 for i in range(n): # Remove the current element from right sum. right -= arr[i] # Find cost of incrementing left side elements leftCost = i * arr[i] - left # Find cost of decrementing right side elements. rightCost = right - (n - 1 - i) * arr[i] ans = min(ans leftCost + rightCost) # Add current value to left sum left += arr[i] return ans if __name__ == '__main__': arr = [1 100 101] print(minCost(arr))
C# // C# program to Make all array // elements equal with minimum cost using System; class GfG { // Function which finds the minimum cost // to make array elements equal. static int minCost(int[] arr) { int n = arr.Length; // Sort the array Array.Sort(arr); // Variable to store sum of elements // to the right side. int right = 0; for (int i = 0; i < n; i++) { right += arr[i]; } int ans = int.MaxValue; int left = 0; for (int i = 0; i < n; i++) { // Remove the current element from right sum. right -= arr[i]; // Find cost of incrementing left side elements int leftCost = i * arr[i] - left; // Find cost of decrementing right side elements. int rightCost = right - (n - 1 - i) * arr[i]; ans = Math.Min(ans leftCost + rightCost); // Add current value to left sum left += arr[i]; } return ans; } static void Main() { int[] arr = {1 100 101}; Console.WriteLine(minCost(arr)); } }
JavaScript // JavaScript program to Make all array // elements equal with minimum cost // Function which finds the minimum cost // to make array elements equal. function minCost(arr) { let n = arr.length; // Sort the array arr.sort((a b) => a - b); // Variable to store sum of elements // to the right side. let right = 0; for (let i = 0; i < n; i++) { right += arr[i]; } let ans = Number.MAX_SAFE_INTEGER; let left = 0; for (let i = 0; i < n; i++) { // Remove the current element from right sum. right -= arr[i]; // Find cost of incrementing left side elements let leftCost = i * arr[i] - left; // Find cost of decrementing right side elements. let rightCost = right - (n - 1 - i) * arr[i]; ans = Math.min(ans leftCost + rightCost); // Add current value to left sum left += arr[i]; } return ans; } let arr = [1 100 101]; console.log(minCost(arr));
الإخراج
100إنشاء اختبار