# Remove minimum elements from array so that max <= 2 * min

Given an array **arr**, the task is to remove minimum number of elements such that after their removal, **max(arr) <= 2 * min(arr)**.

**Examples:**

Input:arr[] = {4, 5, 3, 8, 3}

Output:1

Remove 8 from the array.

Input:arr[] = {1, 2, 3, 4}

Output:1

Remove 1 from the array.

**Approach:** Let us fix each value as the minimum value say **x** and find number of terms that are in range **[x, 2*x]**. This can be done using prefix-sums, we can use map (implements self balancing BST) instead of array as the values can be large. The remaining terms which are not in range **[x, 2*x]** will have to be removed. So, across all values of **x**, we choose the one which maximises the number of terms in range **[x, 2*x]**.

Below is the implementation of the above approach:

`// C++ implementation of the approach ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// Function to return the minimum removals from ` `// arr such that max(arr) <= 2 * min(arr) ` `int` `minimumRemovals(` `int` `n, ` `int` `a[]) ` `{ ` ` ` `// Count occurrence of each element ` ` ` `map<` `int` `, ` `int` `> ct; ` ` ` `for` `(` `int` `i = 0; i < n; i++) ` ` ` `ct[a[i]]++; ` ` ` ` ` `// Take prefix sum ` ` ` `int` `sm = 0; ` ` ` `for` `(` `auto` `mn : ct) { ` ` ` `sm += mn.second; ` ` ` `ct[mn.first] = sm; ` ` ` `} ` ` ` ` ` `int` `mx = 0, prev = 0; ` ` ` `for` `(` `auto` `mn : ct) { ` ` ` ` ` `// Chosen minimum ` ` ` `int` `x = mn.first; ` ` ` `int` `y = 2 * x; ` ` ` `auto` `itr = ct.upper_bound(y); ` ` ` `itr--; ` ` ` ` ` `// Number of elements that are in ` ` ` `// range [x, 2x] ` ` ` `int` `cr = (itr->second) - prev; ` ` ` `mx = max(mx, cr); ` ` ` `prev = mn.second; ` ` ` `} ` ` ` ` ` `// Minimum elements to be removed ` ` ` `return` `n - mx; ` `} ` ` ` `// Driver Program to test above function ` `int` `main() ` `{ ` ` ` `int` `arr[] = { 4, 5, 3, 8, 3 }; ` ` ` `int` `n = ` `sizeof` `(arr) / ` `sizeof` `(arr[0]); ` ` ` `cout << minimumRemovals(n, arr); ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

1

## Recommended Posts:

- Remove minimum number of elements such that no common element exist in both array
- Remove minimum elements from array such that no three consecutive element are either increasing or decreasing
- Remove minimum elements from either side such that 2*min becomes more than max
- Remove minimum elements from either side such that 2*min becomes more than max | Set 2
- Remove exactly one element from the array such that max - min is minimum
- Remove elements from the array which appear more than k times
- Minimum operations required to remove an array
- Remove elements from the array whose frequency lies in the range [l, r]
- Find minimum value to assign all array elements so that array product becomes greater
- Find the first, second and third minimum elements in an array
- Sum of all minimum occurring elements in an Array
- Minimum value among AND of elements of every subset of an array
- Minimum gcd operations to make all array elements one
- Minimum possible sum of array elements after performing the given operation
- Minimum array element changes to make its elements 1 to N

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.