Compruebe si el recuento par e impar de elementos se puede igualar en Array

Dado un arreglo Arr[] de N enteros y un entero K , la tarea es encontrar si es posible igualar el conteo de elementos pares e impares realizando las siguientes operaciones como máximo K veces:

  • Elija cualquier índice i tal que Arr[i] sea par y divídalo por 2.
  • Elija cualquier índice i tal que Arr[i] sea impar y multiplíquelo por 2.

Ejemplos :

Entrada : Arr[] = {1, 4, 8, 12}, K = 2 
Salida : Sí
Explicación : Recuento de impares = 1, Recuento de pares = 3. 
Si hacemos la mitad de 4 dos veces, entonces 4 se convierte en 1 o si hacemos la mitad de 12 dos veces, luego se convierte en 3. 
Es posible hacer que pares e impares cuenten igual realizando 2 operaciones.

Entrada : Arr[] = {1, 2, 3, 4}, K = 0
Salida : Sí

Enfoque : La idea para resolver este problema es la siguiente:

Encuentre el conteo de elementos pares e impares (digamos expresados ​​como CE y CO respectivamente).

El número de elementos necesarios para modificar = abs(CE – CO)/2 .
Un carácter par necesitaba dividirse a la mitad i veces si su bit más a la derecha está en (i+1) la ésima posición desde la derecha. Y un elemento impar puede hacerse par multiplicándolo por 2 en una sola operación.

Use este criterio para encontrar el número de operaciones requeridas y si es como máximo K o no.

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

  • Si N es impar, devuelve Falso.
  • De lo contrario, inicialice un vector (digamos v ) de tamaño 32 con 0 para almacenar el recuento de bits más a la derecha en una posición, CE (Recuento de pares) = 0 y CO (Recuento de impares) = 0.
  • Iterar a través de la array de 0 a N-1
    • Encuentre CE y CO de Arr[]
    • Encuentre el índice del bit establecido más a la derecha para cada elemento de array e incremente ese valor de índice del vector v .
    • Si CE = CO, entonces no se requieren operaciones para igualar los recuentos.
  • Si CO > CE, el resultado será (CO – CE)/2. 
  • De lo contrario, encuentre las operaciones requeridas iterando el vector.
  • Devuelve verdadero si la operación requerida es menor que K. De lo contrario, devuelve falso .

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

C++

// C++ code to implement the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if it is possible
// to make even and odd element count same
// using at most K operations
bool findCount(int* arr, int N, int K)
{
    // Edge Case
    if (N & 1) {
        return 0;
    }
 
    // Initialize the variables
    int Res, CE = 0, CO = 0;
 
    vector<int> v(32, 0);
 
    // Find the index of rightmost set bit
    // for every array element and increment
    // that index of vector, also find even
    // and odd count
    for (int i = 0; i < N; i++) {
 
        if (arr[i] & 1)
            CO++;
 
        else
            CE++;
 
        v[ffs(arr[i]) - 1]++;
    }
 
    // Condition is already true
    if (CE == CO) {
        Res = 0;
    }
 
    // Count of Even > Count of Odd
    else if (CE > CO) {
 
        int n = (CE - CO) / 2;
        Res = 0;
 
        // Find minimum operations to make the
        // even and odd count equal
        for (int i = 1; i < v.size(); i++) {
 
            if (n >= v[i]) {
                Res += v[i] * i;
                n = n - v[i];
            }
            else {
                Res += n * i;
                break;
            }
        }
    }
 
    // Count of Odd > Count of Even
    else {
        Res = (CO - CE) / 2;
    }
 
    return Res <= K;
}
 
// Driver Code
int main()
{
 
    int Arr[] = { 1, 4, 8, 12 };
 
    int N = sizeof(Arr) / sizeof(Arr[0]);
    int K = 2;
 
    // Function Call
    if (findCount(Arr, N, K))
 
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
 
    return 0;
}

Java

// Java code to implement the above approach
 
 
import java.util.*;
 
class GFG{
 
// Function to check if it is possible
// to make even and odd element count same
// using at most K operations
static boolean findCount(int []arr, int N, int K)
{
    // Edge Case
    if ((N & 1)>0) {
        return false;
    }
 
    // Initialize the variables
    int Res, CE = 0, CO = 0;
 
    int []v = new int[32];
 
    // Find the index of rightmost set bit
    // for every array element and increment
    // that index of vector, also find even
    // and odd count
    for (int i = 0; i < N; i++) {
 
        if ((arr[i] & 1)>0)
            CO++;
 
        else
            CE++;
 
        v[arr[i] & (arr[i]-1) - 1]++;
    }
 
    // Condition is already true
    if (CE == CO) {
        Res = 0;
    }
 
    // Count of Even > Count of Odd
    else if (CE > CO) {
 
        int n = (CE - CO) / 2;
        Res = 0;
 
        // Find minimum operations to make the
        // even and odd count equal
        for (int i = 1; i < v.length; i++) {
 
            if (n >= v[i]) {
                Res += v[i] * i;
                n = n - v[i];
            }
            else {
                Res += n * i;
                break;
            }
        }
    }
 
    // Count of Odd > Count of Even
    else {
        Res = (CO - CE) / 2;
    }
 
    return Res <= K;
}
 
// Driver Code
public static void main(String[] args)
{
 
    int Arr[] = { 1, 4, 8, 12 };
 
    int N = Arr.length;
    int K = 2;
 
    // Function Call
    if (findCount(Arr, N, K))
 
        System.out.print("Yes" +"\n");
    else
        System.out.print("No" +"\n");
 
}
}
 
// This code contributed by shikhasingrajput

Python3

# Python code to implement the above approach
 
# Function to check if it is possible
# to make even and odd element count same
# using at most K operations
 
 
def findCount(arr, N, K):
    # Edge Case
    if ((N & 1) != 0):
        return 0
    # Initialize the variables
    Res = 0
    CE = 0
    CO = 0
    v = [0]*32
    # Find the index of rightmost set bit
    # for every array element and increment
    # that index of vector, also find even
    # and odd count
    for i in range(N):
        if ((arr[i] & 1) != 0):
            CO += 1
        else:
            CE += 1
        v[arr[i] & (arr[i]-1) - 1] += 1
 
        # Condition is already true
    if (CE == CO):
        Res = 0
 
    # Count of Even > Count of Odd
    elif (CE > CO):
        n = (CE - CO) / 2
        Res = 0
        # Find minimum operations to make the
        # even and odd count equal
        for i in range(1, len(v)):
            if (n >= v[i]):
                Res += (v[i] * i)
                n = n - v[i]
            else:
                Res += n * i
                break
 
    # Count of Odd > Count of Even
    else:
        Res = (CO - CE) / 2
 
    return Res <= K
 
 
# Driver Code
if __name__ == "__main__":
    Arr = [1, 4, 8, 12]
    N = len(Arr)
    K = 2
 
    # Function Call
    if findCount(Arr, N, K):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by Rohit Pradhan
Producción

Yes

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

Publicación traducida automáticamente

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