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: 2
La nueva array puede ser {1, 1, 1, 1, 1, 1}Entrada: arr[] = {1, 0, 0, 0, 1, 0}, K = 2
Salida: 1
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>
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