Número mínimo de movimientos para hacer una array binaria K periódica

Dada una array binaria arr[] (que contiene solo 0 y 1) y un entero K . La tarea es encontrar el número mínimo de movimientos para hacer que la array sea K-periódica. 
Se dice que una array es K-periódica si las sub-arrays [1 a K] , [k+1 a 2K] , [2k+1 a 3K],… son todas exactamente iguales. 
En un solo movimiento, cualquier 1 se puede cambiar a 0 o cualquier 0 se puede cambiar a 1.

Ejemplos:  

Entrada: arr[] = {1, 1, 0, 0, 1, 1}, K = 2 
Salida:
La nueva array puede ser {1, 1, 1, 1, 1, 1}

Entrada: arr[] = {1, 0, 0, 0, 1, 0}, K = 2 
Salida:
La nueva array puede ser {1, 0, 1, 0, 1, 0} 

Enfoque: para que una array sea K-periódica. Considere los índices i donde i % K = X . Todos estos índices deben tener el mismo valor. Entonces, los 1 se pueden convertir en 0 o viceversa. Para reducir el número de movimientos, elegimos la conversión que es mínima.

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

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the minimum moves required
int minMoves(int n, int a[], int k)
{
 
    int ct1[k] = { 0 }, ct0[k] = { 0 }, moves = 0;
 
    // Count the number of 1s and 2s
    // at each X such that i % K = X
    for (int i = 0; i < n; i++)
        if (a[i] == 1)
            ct1[i % k]++;
        else
            ct0[i % k]++;
 
    // Choose the minimum elements to change
    for (int i = 0; i < k; i++)
        moves += min(ct1[i], ct0[i]);
 
    // Return the minimum moves required
    return moves;
}
 
// Driver code
int main()
{
    int k = 2;
    int a[] = { 1, 0, 0, 0, 1, 0 };
    int n = sizeof(a) / sizeof(a[0]);
    cout << minMoves(n, a, k);
 
    return 0;
}

Java

// Java implementation of the approach
import java.io.*;
 
class GFG
{
 
// Function to return the minimum
// moves required
static int minMoves(int n, int a[], int k)
{
    int ct1[] = new int [k];
    int ct0[] = new int[k];
    int moves = 0;
 
    // Count the number of 1s and 2s
    // at each X such that i % K = X
    for (int i = 0; i < n; i++)
        if (a[i] == 1)
            ct1[i % k]++;
        else
            ct0[i % k]++;
 
    // Choose the minimum elements to change
    for (int i = 0; i < k; i++)
        moves += Math.min(ct1[i], ct0[i]);
 
    // Return the minimum moves required
    return moves;
}
 
// Driver code
public static void main (String[] args)
{
    int k = 2;
    int a[] = { 1, 0, 0, 0, 1, 0 };
    int n = a.length;
    System.out.println(minMoves(n, a, k));
}
}
 
// This is code contributed by inder_verma

Python3

# Python3 implementation of the approach
 
# Function to return the minimum
# moves required
def minMoves(n, a, k):
    ct1 = [0 for i in range(k)]
    ct0 = [0 for i in range(k)]
    moves = 0
 
    # Count the number of 1s and 2s
    # at each X such that i % K = X
    for i in range(n):
        if (a[i] == 1):
            ct1[i % k] += 1
        else:
            ct0[i % k] += 1
 
    # Choose the minimum elements to change
    for i in range(k):
        moves += min(ct1[i], ct0[i])
 
    # Return the minimum moves required
    return moves
 
# Driver code
if __name__ == '__main__':
    k = 2
    a = [1, 0, 0, 0, 1, 0]
    n = len(a)
    print(minMoves(n, a, k))
 
# This code is contributed by
# Surendra_Gangwar

C#

// C# implementation of the approach
using System;
 
class GFG
{
 
// Function to return the minimum
// moves required
static int minMoves(int n, int[] a, int k)
{
    int[] ct1 = new int [k];
    int[] ct0 = new int[k];
    int moves = 0;
 
    // Count the number of 1s and 2s
    // at each X such that i % K = X
    for (int i = 0; i < n; i++)
        if (a[i] == 1)
            ct1[i % k]++;
        else
            ct0[i % k]++;
 
    // Choose the minimum elements to change
    for (int i = 0; i < k; i++)
        moves += Math.Min(ct1[i], ct0[i]);
 
    // Return the minimum moves required
    return moves;
}
 
// Driver code
public static void Main ()
{
    int k = 2;
    int[] a = { 1, 0, 0, 0, 1, 0 };
    int n = a.Length;
    Console.WriteLine(minMoves(n, a, k));
}
}
 
// This is code contributed by Code_Mech

PHP

<?php
// PHP implementation of the approach
 
// Function to return the minimum
// moves required
function minMoves($n, $a, $k)
{
    $ct1 = array();
    $ct0 = array();
    $moves = 0;
 
    // Count the number of 1s and 2s
    // at each X such that i % K = X
    for ($i = 0; $i < $n; $i++)
        if ($a[$i] == 1)
            $ct1[$i % $k]++;
        else
            $ct0[$i % $k]++;
 
    // Choose the minimum elements to change
    for ($i = 0; $i < $k; $i++)
        $moves += min($ct1[$i], $ct0[$i]);
 
    // Return the minimum moves required
    return $moves;
}
 
// Driver code
$k = 2;
$a = array(1, 0, 0, 0, 1, 0);
$n = sizeof($a);
echo(minMoves($n, $a, $k));
 
// This is code contributed by Code_Mech.

Javascript

<script>
 
// Javascript implementation of the approach
 
// Function to return the minimum moves required
function minMoves(n, a, k)
{
 
    let ct1 = new Uint8Array(k),
        ct0 = new Uint8Array(k), moves = 0;
 
    // Count the number of 1s and 2s
    // at each X such that i % K = X
    for(let i = 0; i < n; i++)
        if (a[i] == 1)
            ct1[i % k]++;
        else
            ct0[i % k]++;
 
    // Choose the minimum elements to change
    for(let i = 0; i < k; i++)
        moves += Math.min(ct1[i], ct0[i]);
 
    // Return the minimum moves required
    return moves;
}
 
// Driver code
let k = 2;
let a = [ 1, 0, 0, 0, 1, 0 ];
let n = a.length;
 
document.write(minMoves(n, a, k));
      
// This code is contributed by Mayank Tyagi
     
</script>
Producción: 

1

 

Complejidad de tiempo: O(N)
 

Publicación traducida automáticamente

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