Operaciones mínimas para hacer XOR de array cero

Nos dan una array de n elementos. La tarea es hacer XOR de toda la array 0. Podemos hacer lo siguiente para lograr esto.  

  1. Podemos seleccionar cualquiera de los elementos.
  2. Después de seleccionar un elemento, podemos incrementarlo o decrementarlo en 1.

Necesitamos encontrar el número mínimo de operaciones de incremento/decremento requeridas para que el elemento seleccionado haga que la suma XOR de toda la array sea cero.

Ejemplos: 

Input : arr[] = {2, 4, 8}
Output : Element = 8, 
         Operation required = 2
Explanation : Select 8 as element and perform 2 
              time decrement on it. So that it
              became 6, Now our array is {2, 4, 6} 
              whose XOR sum is 0.

Input : arr[] = {1, 1, 1, 1}
Output : Element = 1, 
         Operation required = 0
Explanation : Select any of 1 and you have already
              your XOR sum = 0. So, no operation 
              required.

Enfoque ingenuo: seleccione un elemento y luego encuentre el XOR del resto de la array. Si ese elemento se vuelve igual al XOR obtenido, entonces nuestro XOR de toda la array debería convertirse en cero. Ahora, nuestro costo por eso será la diferencia absoluta entre el elemento seleccionado y el XOR obtenido. Este proceso de encontrar el costo se realizará para cada elemento y, por lo tanto, dará como resultado una Complejidad de tiempo de (n ^ 2).

Enfoque eficiente: encuentre el XOR de toda la array. Ahora, supongamos que hemos seleccionado el elemento arr[i], por lo que el costo requerido para ese elemento será absoluto (arr[i]-(XORsum^arr[i])). Calculando el mínimo de estos valores absolutos para cada elemento será nuestra operación mínima requerida también el elemento correspondiente a la operación mínima requerida será nuestro elemento seleccionado. 

Implementación:

C++

// CPP to find min cost to make
// XOR of whole array zero
#include <bits/stdc++.h>
using namespace std;
 
// function to find min cost
void minCost(int arr[], int n)
{
    int cost = INT_MAX;
    int element;
 
    // calculate XOR sum of array
    int XOR = 0;
    for (int i = 0; i < n; i++)
        XOR ^= arr[i];
 
    // find the min cost and element corresponding
    for (int i = 0; i < n; i++) {
        if (cost > abs((XOR ^ arr[i]) - arr[i])) {
            cost = abs((XOR ^ arr[i]) - arr[i]);
            element = arr[i];
        }
    }
 
    cout << "Element = " << element << endl;
    cout << "Operation required = " << abs(cost);
}
 
// driver program
int main()
{
    int arr[] = { 2, 8, 4, 16 };
    int n = sizeof(arr) / sizeof(arr[0]);
    minCost(arr, n);
    return 0;
}

Java

// JAVA program to find min cost to make
// XOR of whole array zero
import java.lang.*;
 
class GFG
{
    // function to find min cost
    static void minCost(int[] arr, int n)
    {
        int cost = Integer.MAX_VALUE;
        int element=0;
 
        // calculate XOR sum of array
        int XOR = 0;
        for (int i = 0; i < n; i++)
            XOR ^= arr[i];
 
        // find the min cost and element
        // corresponding
        for (int i = 0; i < n; i++) {
            if (cost > Math.abs((XOR ^ arr[i])
                                - arr[i])) {
                cost = Math.abs((XOR ^ arr[i]) -
                                       arr[i]);
                element = arr[i];
            }
        }
 
    System.out.println("Element = " + element);
    System.out.println("Operation required = "+
                             Math.abs(cost));
    }
 
    // driver program
    public static void main (String[] args)
    {
        int[] arr = { 2, 8, 4, 16 };
        int n = arr.length;
        minCost(arr, n);
    }
}
/* This code is contributed by Kriti Shukla */

Python3

# python to find min cost to make
# XOR of whole array zero
 
# function to find min cost
def minCost(arr,n):
     
    cost = 999999;
     
    # calculate XOR sum of array
    XOR = 0;
    for i in range(0, n):
        XOR ^= arr[i];
 
    # find the min cost and element
    # corresponding
    for i in range(0,n):
        if (cost > abs((XOR ^ arr[i]) - arr[i])):
            cost = abs((XOR ^ arr[i]) - arr[i])
            element = arr[i]
 
    print("Element = ", element)
    print("Operation required = ", abs(cost))
 
 
# driver program
arr = [ 2, 8, 4, 16 ]
n = len(arr)
minCost(arr, n)
 
# This code is contributed by Sam007

C#

// C# program to find min cost to
// make XOR of whole array zero
using System;
 
class GFG
{
    // function to find min cost
    static void minCost(int []arr, int n)
    {
        int cost = int.MaxValue;
        int element=0;
 
        // calculate XOR sum of array
        int XOR = 0;
        for (int i = 0; i < n; i++)
            XOR ^= arr[i];
 
        // find the min cost and
        // element corresponding
        for (int i = 0; i < n; i++)
        {
            if (cost > Math.Abs((XOR ^ arr[i]) - arr[i]))
            {
                cost = Math.Abs((XOR ^ arr[i]) - arr[i]);
                element = arr[i];
            }
        }
 
    Console.WriteLine("Element = " + element);
    Console.Write("Operation required = "+
                          Math.Abs(cost));
    }
 
    // Driver program
    public static void Main ()
    {
        int []arr = {2, 8, 4, 16};
        int n = arr.Length;
        minCost(arr, n);
    }
}
 
// This code is contributed by nitin mittal.

PHP

<?php
// PHP to find min cost to make
// XOR of whole array zero
 
// function to find min cost
function minCost($arr, $n)
{
    $cost = PHP_INT_MAX;
    $element;
 
    // calculate XOR sum of array
    $XOR = 0;
    for ($i = 0; $i < $n; $i++)
        $XOR ^= $arr[$i];
 
    // find the min cost and
    // element corresponding
    for ($i = 0; $i < $n; $i++)
    {
        if ($cost > abs(($XOR ^ $arr[$i]) -
                                 $arr[$i]))
        {
            $cost = abs(($XOR ^ $arr[$i]) -
                                 $arr[$i]);
            $element = $arr[$i];
        }
    }
 
    echo "Element = " , $element ,"\n";
    echo "Operation required = " , abs($cost);
}
 
// Driver Code
$arr = array(2, 8, 4, 16) ;
$n = count($arr);
minCost($arr, $n);
 
// This code is contributed by vt_m.
?>

Javascript

<script>
 
// javascript to find min cost to make
// XOR of whole array zero
 
// function to find min cost
function minCost(arr, n)
{
    var cost = 1000000000;
    var element;
 
    // calculate XOR sum of array
    var XOR = 0;
    for (var i = 0; i < n; i++)
        XOR ^= arr[i];
 
    // find the min cost and element corresponding
    for (var i = 0; i < n; i++) {
        var x= Math.abs((XOR ^ arr[i]) - arr[i])
        if (cost > x) {
            cost = x;
            element = arr[i];
        }
    }
 
    document.write( "Element = " + element + "<br>");
    document.write( "Operation required = " + Math.abs(cost));
}
 
// driver program
var arr = [ 2, 8, 4, 16 ];
var n = arr.length;
minCost(arr, n);
 
</script>
Producción

Element = 16
Operation required = 2

Complejidad de tiempo : O(n)

Este artículo es una contribución de Shivam Pradhan (anuj_charm) . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

Publicación traducida automáticamente

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