Skip to content
Related Articles
Get the best out of our app
GFG App
Open App
geeksforgeeks
Browser
Continue

Related Articles

Minimize the indices of consecutive ones

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

Given an array X[] of odd length N(N ≥ 3) and an integer K. Arrange elements of X[] in such a way that the merged binary representation of all the elements let’s say S has the minimum number of indices i such that  Si = Si+1 = 1. Then you need to perform the given operation K times where you can increment any element by 1 on the initial array, the task is to return the arrangement of elements following the given condition to minimize indices such that 
Si = Si+1 = 1 in the binary representation of new arrangement elements and maximized median of X[] that can be maximized using the given operation.

Note: If there are multiple arrangements satisfying the given criteria then print any valid arrangement. 

Examples:

Input: N = 3, X[] = {3, 6, 5}, K = 2 
Output: Arrangement = 6 5 3 
Maximum Median = 6
Explanation:

  • Arrangement: 
    • Binary representations of 6, 5, and 3 are 110, 101, and 11 respectively. String S is formed by merging all binary representations: 11010111. It has 3 indices i (1, 6, and 7) such that Si = Si+1 = 1. Which are the minimum possible number of such indices. 
  • Maximum Median:
    • Initial X[]: {3, 6, 5}
      • Let us chose X[3] = 5, and increment it by 1. Then updated X[] is: {3, 6, 6}
      • Let us chose X[3] = 6, and increment it by 1. Then updated X[] is: {3, 6, 7}
    • It can be verified that using a given operation under K = 2 times, the Median can’t be maximized than 6. 

Input: N = 5, X[] = {5, 3, 1, 2, 3}, K = 4 
Output: Arrangement = 3 1 2 3 5
Maximum Median = 5
Explanation: It can be verified that the above inputs will generate the outputs as per problem statement.

Approach: Implement the idea below to solve the problem:

The problem is observation and Greedy logic based and can be solve by using some observations. The observations are related to odd numbers present inside X[]. For maximizing median first Sort X[], then increment mid element, Formally X[mid] += 1 and then move X[mid] to its respective sorted position again. You can follow this approach K times

Steps were taken to solve the problem:

  • Steps were taken for arrangement:
    • Create a variable let’s say odd and initialize it equal to -1,
    • Create a StringBuilder object let’s say Sb.
    • Run a loop for traversing X[] and follow the below-mentioned steps under the scope of the loop:
      • if (X[ i ] % 2 ! =  0 && odd ==  -1),  Then odd = X[ i ]
      • else Sb.append( X[ i ] )
    • if (odd != -1) then Sb.append(odd)
    • Output StringBuilder Sb.
  • Steps were taken for maximizing the median:
    • Sort X[].
    • Create a variable let’s say mid = (X.length – 1)/2
    • Run a loop K number of times and follow the below-mentioned steps under the scope of the loop:
      • Increment X[mid], Formally X[mid] += 1 
      • Swap X[mid] to its right side at its respective sorted position.
    • Output X[mid].          

Below is the code to implement the approach:

C++




#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
// Method for valid arrangements
void Arrangement(int N, vector<int>& X) {
    int odd = -1;
 
    // Vector object created
    vector<int> l;
 
    // Loop for traversing over X[]
    for (int i = 0; i < N; i++) {
        if (X[i] % 2 != 0 && odd == -1) {
            odd = X[i];
        } else {
            l.push_back(X[i]);
        }
    }
 
    if (odd != -1) {
        l.push_back(odd);
    }
 
    // Printing arrangement
    cout << "Arrangement : ";
    for (int i = 0; i < l.size(); i++) {
        cout << l[i] << " ";
    }
    cout << endl;
}
 
// Method for maximizing median
void Max_Median(int K, vector<int>& X) {
    // Sorting X[] using in-built sort function
    sort(X.begin(), X.end());
 
    // Calculating mid-index
    int mid = (X.size() - 1) / 2;
 
    // Loop for K number of times
    for (int j = 1; j <= K; j++) {
        // Incrementing mid
        X[mid]++;
 
        // Temporary variable to hold mid index value
        int i = mid;
 
        // Loop for sorting X[] after incrementing X[mid] element
        // Formally, It swaps mid element until it is greater than its
        // right adjacent element for placing incremented X[mid]
        // at its sorting position
        while (X[i] > X[i + 1] && i <= X.size() - 2) {
            int temp = X[i];
            X[i] = X[i + 1];
            X[i + 1] = temp;
 
            if (i < X.size() - 2) {
                i++;
            }
        }
    }
 
    // Printing Maximized median
    cout << "Maximum Median : " << X[mid] << endl;
}
 
// Driver Function
int main() {
    // Inputs
    int N = 3;
    int K = 2;
    vector<int> X {3, 6, 5};
 
    // Function call for arrangement
    Arrangement(N, X);
 
    // Function call for Maximum Max_Median
    Max_Median(K, X);
 
    return 0;
}
 
// This code is contributed by Tushar_Rokade


Java




// Java code to implement the approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
class GFG {
 
    // Driver Function
    public static void main(String[] args)
        throws java.lang.Exception
    {
 
        // Inputs
        int N = 3;
        int K = 2;
        int X[] = { 3, 6, 5 };
 
        // Function call for arrangement
        System.out.print("Arrangement : ");
        Arrangement(N, X);
 
        // Function call for Maximum
        // Max_Median
        Max_Median(K, X);
    }
 
    // Method for valid arrangements
    static void Arrangement(int N, int X[])
    {
        int odd = -1;
 
        // StringBuilder object created
        StringBuilder sb = new StringBuilder();
 
        // Loop for traversing over X[]
        for (int i = 0; i < N; i++) {
            if (X[i] % 2 != 0 && odd == -1) {
                odd = X[i];
            }
            else {
                sb.append(X[i]);
                sb.append(" ");
            }
        }
        if (odd != -1) {
            sb.append(odd);
        }
 
        // Printing arrangement
        System.out.println(" " + sb);
    }
 
    // Method for maximizing median
    static void Max_Median(int K, int X[])
    {
 
        // Sorting X[] using in-built sort
        // function
        Arrays.sort(X);
 
        // Calculating mid-index
        int mid = (X.length - 1) / 2;
 
        // Loop for K number of times
        for (int j = 1; j <= K; j++) {
 
            // Incrementing mid
            X[mid] += 1;
 
            // Temporary variable to hold
            // mid index value
            int i = mid;
 
            // Loop for sorting X[] after
            // incrementing X[mid] element
            // Formally, It swaps mid element
            // until it is greater than its
            // right adjacent element for
            // placing incremented X[mid]
            // at its sorting position
            while (X[i] > X[i + 1] && i <= X.length - 2) {
                int temp = X[i];
                X[i] = X[i + 1];
                X[i + 1] = temp;
 
                if (i < X.length - 2)
                    i++;
            }
        }
 
        // Printing Maximized median
        System.out.println("Maximum Median : " + X[mid]);
    }
}


Python3




import numpy as np
 
# Method for valid arrangements
def Arrangement(N, X):
    odd = -1
 
    # List object created
    l = []
 
    # Loop for traversing over X[]
    for i in range(N):
        if X[i] % 2 != 0 and odd == -1:
            odd = X[i]
        else:
            l.append(X[i])
 
    if odd != -1:
        l.append(odd)
 
    # Printing arrangement
    print("Arrangement : ", end="")
    print(*l, sep=" ")
 
# Method for maximizing median
def Max_Median(K, X):
    # Sorting X[] using in-built sort
    # function
    X = np.sort(X)
 
    # Calculating mid-index
    mid = (X.shape[0] - 1) // 2
 
    # Loop for K number of times
    for j in range(1, K+1):
        # Incrementing mid
        X[mid] += 1
 
        # Temporary variable to hold
        # mid index value
        i = mid
 
        # Loop for sorting X[] after
        # incrementing X[mid] element
        # Formally, It swaps mid element
        # until it is greater than its
        # right adjacent element for
        # placing incremented X[mid]
        # at its sorting position
        while X[i] > X[i + 1] and i <= X.shape[0] - 2:
            temp = X[i]
            X[i] = X[i + 1]
            X[i + 1] = temp
 
            if i < X.shape[0] - 2:
                i += 1
 
    # Printing Maximized median
    print("Maximum Median :", X[mid])
 
# Driver Function
if __name__ == "__main__":
 
    # Inputs
    N = 3
    K = 2
    X = np.array([3, 6, 5])
 
    # Function call for arrangement
    Arrangement(N, X)
 
    # Function call for Maximum
    # Max_Median
    Max_Median(K, X)


C#




using System;
using System.Collections.Generic;
using System.Linq;
 
class Program {
   
  // Method for valid arrangements
  static void Arrangement(int N, List<int> X) {
    int odd = -1;
 
    // List object created
    List<int> l = new List<int>();
 
    // Loop for traversing over X[]
    for (int i = 0; i < N; i++) {
      if (X[i] % 2 != 0 && odd == -1) {
        odd = X[i];
      } else {
        l.Add(X[i]);
      }
    }
 
    if (odd != -1) {
      l.Add(odd);
    }
 
    // Printing arrangement
    Console.Write("Arrangement : ");
    foreach (int i in l) {
      Console.Write(i + " ");
    }
    Console.WriteLine();
  }
 
  // Method for maximizing median
  static void Max_Median(int K, List<int> X) {
    // Sorting X[] using in-built sort function
    X.Sort();
 
    // Calculating mid-index
    int mid = (X.Count - 1) / 2;
 
    // Loop for K number of times
    for (int j = 1; j <= K; j++) {
      // Incrementing mid
      X[mid]++;
 
      // Temporary variable to hold mid index value
      int i = mid;
 
      // Loop for sorting X[] after incrementing X[mid] element
      // Formally, It swaps mid element until it is greater than its
      // right adjacent element for placing incremented X[mid]
      // at its sorting position
      while (X[i] > X[i + 1] && i <= X.Count - 2) {
        int temp = X[i];
        X[i] = X[i + 1];
        X[i + 1] = temp;
 
        if (i < X.Count - 2) {
          i++;
        }
      }
    }
 
    // Printing Maximized median
    Console.WriteLine("Maximum Median : " + X[mid]);
  }
 
  // Driver Function
  static void Main() {
    // Inputs
    int N = 3;
    int K = 2;
    List<int> X = new List<int> {3, 6, 5};
 
    // Function call for arrangement
    Arrangement(N, X);
 
    // Function call for Maximum Max_Median
    Max_Median(K, X);
  }
}


Javascript




<script>
function arrangement(N, X) {
  let odd = -1;
  let l = [];
 
  for (let i = 0; i < N; i++) {
    if (X[i] % 2 !== 0 && odd === -1) {
      odd = X[i];
    } else {
      l.push(X[i]);
    }
  }
 
  if (odd !== -1) {
    l.push(odd);
  }
 
  console.log("Arrangement: " + l.join(" "));
}
 
function maxMedian(K, X) {
  X.sort((a, b) => a - b);
  let mid = Math.floor((X.length - 1) / 2);
 
  for (let j = 1; j <= K; j++) {
    X[mid]++;
    let i = mid;
 
    while (X[i] > X[i + 1] && i <= X.length - 2) {
      let temp = X[i];
      X[i] = X[i + 1];
      X[i + 1] = temp;
 
      if (i < X.length - 2) {
        i++;
      }
    }
  }
 
  console.log("Maximum Median: " + X[mid]);
}
 
let N = 3;
let K = 2;
let X = [3, 6, 5];
 
arrangement(N, X);
maxMedian(K, X);
</script>


Output

Arrangement :  6 5 3
Maximum Median : 6

Time Complexity: O(K * N), for arrangement of numbers, O(N * Log(N)), to find maximum median
Auxiliary Space: O(1)


My Personal Notes arrow_drop_up
Last Updated : 21 Mar, 2023
Like Article
Save Article
Similar Reads
Related Tutorials