Maximice la suma de arrays alternando los signos de los elementos adyacentes

Dada una array , arr[] de tamaño N , la tarea es encontrar la suma máxima posible de elementos de la array alternando los signos de los elementos de la array adyacentes.

Ejemplos:

Entrada: arr[] = { -2, 1, 0 } 
Salida:
Explicación: 
Alternar los signos de (arr[0], arr[1]) modifica arr[] a {2, -1, 0}. 
Alternar los signos de (arr[1], arr[2]) modifica arr[] a {2, 1, 0}. 
Por lo tanto, la salida requerida = (2 + 1 + 0) = 3, que es la suma máxima posible.

Entrada: arr[] = { 1, 1, -2, -4, 5 } 
Salida: 13 
Explicación: 
Alternar los signos de (arr[2], arr[3]) modifica arr[] a { 1, 1, 2 , 4, 5 } 
Por lo tanto, la salida requerida = (1 + 1 + 2 + 4 + 5) = 13, que es la suma máxima posible.

Enfoque: El problema se puede resolver usando la técnica Greedy . La idea se basa en el hecho de que el recuento máximo de elementos negativos en la array después de alternar los signos de los elementos adyacentes no puede ser mayor que 1 . Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos MaxAltSum , para almacenar la suma máxima posible de elementos de array alternando los signos de elementos adyacentes.
  • Recorra la array y cuente el número de elementos negativos en la array.
  • Si el recuento de elementos negativos en la array es par , entonces la suma máxima posible alternando los signos de los elementos de la array adyacentes es igual a la suma del valor absoluto de los elementos de la array, es decir, MaxAltSum = Σabs(arr[i])
  • De lo contrario, la suma máxima posible obtenida de la array al alternar los signos de los elementos de la array adyacentes es igual a la suma del valor absoluto de todos los elementos de la array posibles, excepto el valor absoluto más pequeño de los elementos de la array. es decir, MaxAltSum = ((Σabs(arr[i])) – 2 * X) , ​​donde X es el valor absoluto más pequeño de los elementos de la array.
  • Finalmente, imprima el valor MaxAltSum .

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

C++

// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum sum by alternating
// the signs of adjacent elements of the array
int findMaxSumByAlternatingSign(int arr[], int N)
{
    // Stores count of negative
    // elements in the array
    int cntNeg = 0;
 
    // Stores maximum sum by alternating
    // the signs of adjacent elements
    int MaxAltSum = 0;
 
    // Stores smallest absolute
    // value of array elements
    int SmValue = 0;
 
    // Stores sum of absolute
    // value of array elements
    int sum = 0;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // If arr[i] is
        // a negative number
        if (arr[i] < 0) {
 
            // Update cntNeg
            cntNeg += 1;
        }
 
        // Update sum
        sum += abs(arr[i]);
 
        // Update SmValue
        SmValue = min(SmValue,
                    abs(arr[i]));
    }
 
    // Update MaxAltSum
    MaxAltSum = sum;
 
    // If cntNeg is
    // an odd number
    if (cntNeg & 1) {
 
        // Update MaxAltSum
        MaxAltSum -= 2 * SmValue;
    }
    return MaxAltSum;
}
 
// Drivers Code
int main()
{
 
    int arr[] = { 1, 1, -2, -4, 5 };
    int N = sizeof(arr)
            / sizeof(arr[0]);
 
    cout << findMaxSumByAlternatingSign(
        arr, N);
}

Java

// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
 
// Function to find the maximum sum by alternating
// the signs of adjacent elements of the array
static int findMaxSumByAlternatingSign(int arr[],
                                       int N)
{
     
    // Stores count of negative
    // elements in the array
    int cntNeg = 0;
 
    // Stores maximum sum by alternating
    // the signs of adjacent elements
    int MaxAltSum = 0;
 
    // Stores smallest absolute
    // value of array elements
    int SmValue = 0;
 
    // Stores sum of absolute
    // value of array elements
    int sum = 0;
 
    // Traverse the array
    for(int i = 0; i < N; i++)
    {
         
        // If arr[i] is
        // a negative number
        if (arr[i] < 0)
        {
             
            // Update cntNeg
            cntNeg += 1;
        }
         
        // Update sum
        sum += Math.abs(arr[i]);
         
        // Update SmValue
        SmValue = Math.min(SmValue,
                  Math.abs(arr[i]));
    }
 
    // Update MaxAltSum
    MaxAltSum = sum;
     
    // If cntNeg is
    // an odd number
    if (cntNeg % 2 == 1)
    {
         
        // Update MaxAltSum
        MaxAltSum -= 2 * SmValue;
    }
    return MaxAltSum;
}
 
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 1, 1, -2, -4, 5 };
    int N = arr.length;
     
    System.out.print(findMaxSumByAlternatingSign(
    arr, N));
}
}
 
// This code is contributed by jana_sayantan

Python3

# Python3 program to implement
# the above approach
 
# Function to find the maximum sum by
# alternating the signs of adjacent
# elements of the array
def findMaxSumByAlternatingSign(arr, N):
     
    # Stores count of negative
    # elements in the array
    cntNeg = 0
 
    # Stores maximum sum by alternating
    # the signs of adjacent elements
    MaxAltSum = 0
 
    # Stores smallest absolute
    # value of array elements
    SmValue = 0
 
    # Stores sum of absolute
    # value of array elements
    sum = 0
 
    # Traverse the array
    for i in range(N):
         
        # If arr[i] is
        # a negative number
        if (arr[i] < 0):
             
            # Update cntNeg
            cntNeg += 1
 
        # Update sum
        sum += abs(arr[i])
 
        # Update SmValue
        SmValue = min(SmValue, abs(arr[i]))
 
    # Update MaxAltSum
    MaxAltSum = sum
 
    # If cntNeg is
    # an odd number
    if (cntNeg & 1):
         
        # Update MaxAltSum
        MaxAltSum -= 2 * SmValue
         
    return MaxAltSum
 
# Driver Code
if __name__ == '__main__':
     
    arr = [ 1, 1, -2, -4, 5 ]
    N = len(arr)
 
    print(findMaxSumByAlternatingSign(arr, N))
 
# This code is contributed by SURENDRA_GANGWAR

C#

// C# program to implement
// the above approach
using System;
 
class GFG{
 
// Function to find the maximum sum by alternating
// the signs of adjacent elements of the array
static int findMaxSumByAlternatingSign(int []arr,
                                    int N)
{
     
    // Stores count of negative
    // elements in the array
    int cntNeg = 0;
 
    // Stores maximum sum by alternating
    // the signs of adjacent elements
    int MaxAltSum = 0;
 
    // Stores smallest absolute
    // value of array elements
    int SmValue = 0;
 
    // Stores sum of absolute
    // value of array elements
    int sum = 0;
 
    // Traverse the array
    for(int i = 0; i < N; i++)
    {
         
        // If arr[i] is
        // a negative number
        if (arr[i] < 0)
        {
             
            // Update cntNeg
            cntNeg += 1;
        }
         
        // Update sum
        sum += Math.Abs(arr[i]);
         
        // Update SmValue
        SmValue = Math.Min(SmValue,
                Math.Abs(arr[i]));
    }
 
    // Update MaxAltSum
    MaxAltSum = sum;
     
    // If cntNeg is
    // an odd number
    if (cntNeg % 2 == 1)
    {
         
        // Update MaxAltSum
        MaxAltSum -= 2 * SmValue;
    }
    return MaxAltSum;
}
 
// Driver Code
public static void Main(String[] args)
{
    int []arr = { 1, 1, -2, -4, 5 };
    int N = arr.Length;
     
    Console.Write(findMaxSumByAlternatingSign(
    arr, N));
}
}
 
// This code is contributed by shivanisinghss2110

Javascript

<script>
 
// Javascript program to implement
// the above approach
 
// Function to find the maximum sum by alternating
// the signs of adjacent elements of the array
function findMaxSumByAlternatingSign(arr, N)
{
       
    // Stores count of negative
    // elements in the array
    let cntNeg = 0;
   
    // Stores maximum sum by alternating
    // the signs of adjacent elements
    let MaxAltSum = 0;
   
    // Stores smallest absolute
    // value of array elements
    let SmValue = 0;
   
    // Stores sum of absolute
    // value of array elements
    let sum = 0;
   
    // Traverse the array
    for(let i = 0; i < N; i++)
    {
           
        // If arr[i] is
        // a negative number
        if (arr[i] < 0)
        {
               
            // Update cntNeg
            cntNeg += 1;
        }
           
        // Update sum
        sum += Math.abs(arr[i]);
           
        // Update SmValue
        SmValue = Math.min(SmValue,
                  Math.abs(arr[i]));
    }
   
    // Update MaxAltSum
    MaxAltSum = sum;
       
    // If cntNeg is
    // an odd number
    if (cntNeg % 2 == 1)
    {
           
        // Update MaxAltSum
        MaxAltSum -= 2 * SmValue;
    }
    return MaxAltSum;
}
 
    // Driver Code
    let arr = [ 1, 1, -2, -4, 5 ];
    let N = arr.length;
       
    document.write(findMaxSumByAlternatingSign(
    arr, N));
 
// This code is contributed by souravghosh0416.
</script>

Producción:

13

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por reapedjuggler 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 *