נתון מערך של גודל נ המשימה היא להפוך את הערך של כל האלמנטים לשווה עם עלות מינימלית . העלות של שינוי ערך מ-x ל-y היא abs(x - y).
דוגמאות:
קֶלֶט: arr[] = [1 100 101]
תְפוּקָה : 100
הֶסבֵּר: אנחנו יכולים לשנות את כל הערכים שלו ל-100 בעלות מינימלית
|1 - 100| + |100 - 100| + |101 - 100| = 100קֶלֶט : arr[] = [4 6]
תְפוּקָה : 2
הֶסבֵּר: אנחנו יכולים לשנות את כל הערכים שלו ל-5 בעלות מינימלית
|4 - 5| + |5 - 6| = 2קֶלֶט: arr[] = [5 5 5 5]
תְפוּקָה:
הֶסבֵּר: כל הערכים כבר שווים.
[גישה נאיבית] שימוש ב-2 לולאות מקוננות - זמן 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צור חידון