Reorganizar array para minimizar la diferencia de la suma de cuadrados de elementos de índice pares e impares

Dada una array arr[] de tamaño N (múltiplo de 8) donde los valores de la array estarán en el rango [a, (a+8*N) -1] ( a puede ser cualquier número entero positivo), la tarea es reorganizar la array de manera que la diferencia entre la suma de los cuadrados de los índices impares y la suma de los cuadrados de los elementos de los índices pares sea la mínima entre todas las reorganizaciones posibles.

Nota: si hay múltiples reordenamientos, devuelva cualquiera de ellos.

Ejemplos :

Entrada : arr[] = {1, 2, 3, 4, 5, 6, 7, 8}
Salida : 1 2 4 3 7 8 6 5 
Explicación:   La diferencia es 0 como 1 + 4 2 + 7 2 + 6 2 = 102 = 2 2 + 3 2 + 8 2 + 5 2

Entrada : arr[] = { 9, 11, 12, 15, 16, 13, 10, 14}
Salida : 9 10 12 11 15 16 14 13
Explicación: La diferencia es 0 como 9 2 + 12 2 + 15 2 + 14 2 = 10 2 + 11 2 + 16 2 + 13 2 = 646

 

Enfoque: Este problema se puede resolver con base en la siguiente observación matemática:

Para cualquier entero positivo S, ( S ) 2 + ( S+3 ) 2 – 4 = ( S+1 ) 2 + ( S+2 ) 2 . Como N es un múltiplo de 8, se puede dividir en N/8 grupos donde la diferencia de la suma de los cuadrados de los elementos en los índices pares e impares para cada grupo es 0 .
Para los primeros cuatro elementos mantenga mayor la suma de cuadrados de índices impares y cuatro los cuatro siguientes justo al contrario para mantener mayor la suma de cuadrados de índices pares. Entonces este grupo de 8 elementos tendrá diferencia 0 . Como se hace lo mismo para todos los grupos N/8, la diferencia global será 0 .

La secuencia de cada grupo puede ser como: S, S+1, S+3, S+2, S+6, S+7, S+5, S+4

Siga los pasos a continuación para resolver este problema: 

  • Divida la array en grupos de tamaño 8.
  • Ordene los elementos en cada grupo como derivados de la observación.
  • Devuelve la array reorganizada.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find
// maximum element of the array
int maximum(int arr[], int size)
{
    int ma = INT_MIN;
    for (int i = 0; i < size; i++) {
        ma = max(ma, arr[i]);
    }
    return ma;
}
 
// Function to find
// minimum element of the array
int minimum(int arr[], int size)
{
    int mi = INT_MAX;
    for (int i = 0; i < size; i++) {
        mi = min(mi, arr[i]);
    }
    return mi;
}
 
// Function to print the array
void print_min(int arr[], int size)
{
    int low = minimum(arr, size);
    int high = maximum(arr, size);
 
    // using the fact that
    // s^2 + (s+3)^2 = (s+1)^2 + (s+2)^2 + 4.
    for (int i = 0; i < size; i += 4) {
 
        // Making the difference +4
        // for the odd indices
        if (i % 8 == 0) {
            arr[i] = low;
            arr[i + 2] = low + 3;
            arr[i + 1] = low + 1;
            arr[i + 3] = low + 2;
        }
 
        // Making the difference -4 for
        // odd indices +4 - 4 = 0 (balanced)
        else {
            arr[i] = low + 2;
            arr[i + 2] = low + 1;
            arr[i + 1] = low + 3;
            arr[i + 3] = low;
        }
        low += 4;
    }
 
    // Printing the array
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
}
 
// Driver code
int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int N = sizeof(arr) / (sizeof(int));
 
    // Function call
    print_min(arr, N);
    return 0;
}

Java

// JAVA code to implement the approach
import java.util.*;
class GFG
{
 
  // Function to find
  // maximum element of the array
  public static int maximum(int arr[], int size)
  {
    int ma = Integer.MIN_VALUE;
    for (int i = 0; i < size; i++) {
      ma = Math.max(ma, arr[i]);
    }
    return ma;
  }
 
  // Function to find
  // minimum element of the array
  public static int minimum(int arr[], int size)
  {
    int mi = Integer.MAX_VALUE;
    for (int i = 0; i < size; i++) {
      mi = Math.min(mi, arr[i]);
    }
    return mi;
  }
 
  // Function to print the array
  public static void print_min(int arr[], int size)
  {
    int low = minimum(arr, size);
    int high = maximum(arr, size);
 
    // using the fact that
    // s^2 + (s+3)^2 = (s+1)^2 + (s+2)^2 + 4.
    for (int i = 0; i < size; i += 4) {
 
      // Making the difference +4
      // for the odd indices
      if (i % 8 == 0) {
        arr[i] = low;
        arr[i + 2] = low + 3;
        arr[i + 1] = low + 1;
        arr[i + 3] = low + 2;
      }
 
      // Making the difference -4 for
      // odd indices +4 - 4 = 0 (balanced)
      else {
        arr[i] = low + 2;
        arr[i + 2] = low + 1;
        arr[i + 1] = low + 3;
        arr[i + 3] = low;
      }
      low += 4;
    }
 
    // Printing the array
    for (int i = 0; i < size; i++) {
      System.out.print(arr[i] + " ");
    }
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int N = arr.length;
 
    // Function call
    print_min(arr, N);
  }
}
 
// This code is contributed by Taranpreet

Python3

# Python code to implement the approach
INT_MIN = -2147483647 - 1
INT_MAX = 2147483647
 
# Function to find
# maximum element of the array
def maximum(arr, size):
    ma = INT_MIN
    for i in range(size):
        ma = max(ma, arr[i])
     
    return ma
 
# Function to find
# minimum element of the array
def minimum(arr, size):
    mi = INT_MAX
    for i in range(size):
        mi = min(mi, arr[i])
    
    return mi
 
# Function to print the array
def print_min(arr, size):
    low = minimum(arr, size)
    high = maximum(arr, size)
 
    # using the fact that
    # s^2 + (s+3)^2 = (s+1)^2 + (s+2)^2 + 4.
    for i in range(0,size,4):
 
        # Making the difference +4
        # for the odd indices
        if (i % 8 == 0):
            arr[i] = low
            arr[i + 2] = low + 3
            arr[i + 1] = low + 1
            arr[i + 3] = low + 2
 
        # Making the difference -4 for
        # odd indices +4 - 4 = 0 (balanced)
        else:
            arr[i] = low + 2
            arr[i + 2] = low + 1
            arr[i + 1] = low + 3
            arr[i + 3] = low
         
        low += 4
 
    # Printing the array
    for i in range(size):
        print(arr[i],end=" ")
 
 
# Driver code
 
arr = [1, 2, 3, 4, 5, 6, 7, 8]
N = len(arr)
 
# Function call
print_min(arr, N)
 
# This code is contributed by shinjanpatra

C#

// C# code to implement the approach
using System;
class GFG {
 
  // Function to find
  // maximum element of the array
  static int maximum(int[] arr, int size)
  {
    int ma = Int32.MinValue;
    for (int i = 0; i < size; i++) {
      ma = Math.Max(ma, arr[i]);
    }
    return ma;
  }
 
  // Function to find
  // minimum element of the array
  static int minimum(int[] arr, int size)
  {
    int mi = Int32.MaxValue;
    for (int i = 0; i < size; i++) {
      mi = Math.Min(mi, arr[i]);
    }
    return mi;
  }
 
  // Function to print the array
  static void print_min(int[] arr, int size)
  {
    int low = minimum(arr, size);
    int high = maximum(arr, size);
 
    // using the fact that
    // s^2 + (s+3)^2 = (s+1)^2 + (s+2)^2 + 4.
    for (int i = 0; i < size; i += 4) {
 
      // Making the difference +4
      // for the odd indices
      if (i % 8 == 0) {
        arr[i] = low;
        arr[i + 2] = low + 3;
        arr[i + 1] = low + 1;
        arr[i + 3] = low + 2;
      }
 
      // Making the difference -4 for
      // odd indices +4 - 4 = 0 (balanced)
      else {
        arr[i] = low + 2;
        arr[i + 2] = low + 1;
        arr[i + 1] = low + 3;
        arr[i + 3] = low;
      }
      low += 4;
    }
 
    // Printing the array
    for (int i = 0; i < size; i++) {
      Console.Write(arr[i] + " ");
    }
  }
 
  // Driver code
  public static void Main()
  {
    int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int N = arr.Length;
 
    // Function call
    print_min(arr, N);
  }
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
    // JavaScript code to implement the approach
    const INT_MIN = -2147483647 - 1;
    const INT_MAX = 2147483647;
 
    // Function to find
    // maximum element of the array
    const maximum = (arr, size) => {
        let ma = INT_MIN;
        for (let i = 0; i < size; i++) {
            ma = Math.max(ma, arr[i]);
        }
        return ma;
    }
 
    // Function to find
    // minimum element of the array
    const minimum = (arr, size) => {
        let mi = INT_MAX;
        for (let i = 0; i < size; i++) {
            mi = Math.min(mi, arr[i]);
        }
        return mi;
    }
 
    // Function to print the array
    const print_min = (arr, size) => {
        let low = minimum(arr, size);
        let high = maximum(arr, size);
 
        // using the fact that
        // s^2 + (s+3)^2 = (s+1)^2 + (s+2)^2 + 4.
        for (let i = 0; i < size; i += 4) {
 
            // Making the difference +4
            // for the odd indices
            if (i % 8 == 0) {
                arr[i] = low;
                arr[i + 2] = low + 3;
                arr[i + 1] = low + 1;
                arr[i + 3] = low + 2;
            }
 
            // Making the difference -4 for
            // odd indices +4 - 4 = 0 (balanced)
            else {
                arr[i] = low + 2;
                arr[i + 2] = low + 1;
                arr[i + 1] = low + 3;
                arr[i + 3] = low;
            }
            low += 4;
        }
 
        // Printing the array
        for (let i = 0; i < size; i++) {
            document.write(`${arr[i]} `);
        }
    }
 
    // Driver code
 
    let arr = [1, 2, 3, 4, 5, 6, 7, 8];
    let N = arr.length;
 
    // Function call
    print_min(arr, N);
 
// This code is contributed by rakeshsahni
 
</script>
Producción

1 2 4 3 7 8 6 5 

Complejidad de Tiempo : O(N)
Espacio Auxiliar : O(1)

Publicación traducida automáticamente

Artículo escrito por sapu10lm39 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *