Dada una array arr[] de N enteros y un entero M donde N % M = 0 . La tarea es encontrar el número mínimo de operaciones que deben realizarse en la array para hacer que c 0 = c 1 = ….. = c M – 1 = N / M donde c r es la cantidad de elementos en la array dada teniendo resto r cuando se divide por M . En cada operación, cualquier elemento de la array se puede incrementar en 1 .
Ejemplos:
Entrada: arr[] = {1, 2, 3}, M = 3
Salida: 0
Después de realizar la operación de módulo en la array dada, la array se convierte en {0, 1, 2}
Y cuenta de c 0 = c 1 = c 2 = n / m = 1.
Por lo tanto, no se requieren operaciones adicionales.Entrada: arr[] = {3, 2, 0, 6, 10, 12}, M = 3
Salida: 3
Después de realizar la operación de módulo en la array dada, la array se convierte en {0, 2, 0, 0, 1, 0}
Y cuenta de c 0 = 4, c 1 = 1 y c 2 = 1. Para hacer c 0 = c 1 = c 2 = n / m = 2.
Sume 1 a 6 y 2 a 12, entonces la array se convierte en { 3, 2, 0, 7, 10, 14} y c 0 = c 1 = c 2 = n / m = 2.
Enfoque: para cada i de 0 a m – 1 , encuentre todos los elementos de la array que sean congruentes con i módulo m y almacene sus índices en una lista. Además, crea un vector llamado extra y deja k = n / m .
Tenemos que pasar de 0 a m – 1 dos veces. Para cada i de 0 a m – 1 , si hay más elementos que k en la lista, elimine los elementos adicionales de esta lista y agréguelos a extra. Si, en cambio, hay elementos menores que k , elimine los últimos elementos del vector extra. Por cada índice eliminado idx , aumente arr[idx] en (i – arr[idx]) % m .
Es obvio que después de las primeras m iteraciones, cada lista tendrá como máximo el tamaño k y después de m más iteraciones, todas las listas tendrán el mismo tamaño, es decir , k .
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 // number of operations required int minOperations(int n, int a[], int m) { int k = n / m; // To store modulos values vector<vector<int> > val(m); for (int i = 0; i < n; ++i) { val[a[i] % m].push_back(i); } long long ans = 0; vector<pair<int, int> > extra; for (int i = 0; i < 2 * m; ++i) { int cur = i % m; // If it's size greater than k // it needed to be decreased while (int(val[cur].size()) > k) { int elem = val[cur].back(); val[cur].pop_back(); extra.push_back(make_pair(elem, i)); } // If it's size is less than k // it needed to be increased while (int(val[cur].size()) < k && !extra.empty()) { int elem = extra.back().first; int mmod = extra.back().second; extra.pop_back(); val[cur].push_back(elem); ans += i - mmod; } } return ans; } // Driver code int main() { int m = 3; int a[] = { 3, 2, 0, 6, 10, 12 }; int n = sizeof(a) / sizeof(a[0]); cout << minOperations(n, a, m); return 0; }
Java
// Java implementation of the approach import java.util.*; class GFG{ static class pair { int first, second; public pair(int first, int second) { this.first = first; this.second = second; } } // Function to return the minimum // number of operations required static int minOperations(int n, int a[], int m) { int k = n / m; // To store modulos values @SuppressWarnings("unchecked") Vector<Integer> []val = new Vector[m]; for(int i = 0; i < val.length; i++) val[i] = new Vector<Integer>(); for(int i = 0; i < n; ++i) { val[a[i] % m].add(i); } long ans = 0; Vector<pair> extra = new Vector<>(); for(int i = 0; i < 2 * m; ++i) { int cur = i % m; // If it's size greater than k // it needed to be decreased while ((val[cur].size()) > k) { int elem = val[cur].lastElement(); val[cur].removeElementAt(val[cur].size() - 1); extra.add(new pair(elem, i)); } // If it's size is less than k // it needed to be increased while (val[cur].size() < k && !extra.isEmpty()) { int elem = extra.get(extra.size() - 1).first; int mmod = extra.get(extra.size() - 1).second; extra.remove(extra.size() - 1); val[cur].add(elem); ans += i - mmod; } } return (int)ans; } // Driver code public static void main(String[] args) { int m = 3; int a[] = { 3, 2, 0, 6, 10, 12 }; int n = a.length; System.out.print(minOperations(n, a, m)); } } // This code is contributed by Princi Singh
Python3
# Python3 implementation of the approach # Function to return the minimum # number of operations required def minOperations(n, a, m): k = n // m # To store modulos values val = [[] for i in range(m)] for i in range(0, n): val[a[i] % m].append(i) ans = 0 extra = [] for i in range(0, 2 * m): cur = i % m # If it's size greater than k # it needed to be decreased while len(val[cur]) > k: elem = val[cur].pop() extra.append((elem, i)) # If it's size is less than k # it needed to be increased while (len(val[cur]) < k and len(extra) > 0): elem = extra[-1][0] mmod = extra[-1][1] extra.pop() val[cur].append(elem) ans += i - mmod return ans # Driver code if __name__ == "__main__": m = 3 a = [3, 2, 0, 6, 10, 12] n = len(a) print(minOperations(n, a, m)) # This code is contributed by Rituraj Jain
C#
// C# implementation of the // above approach using System; using System.Collections.Generic; class GFG{ public class pair { public int first, second; public pair(int first, int second) { this.first = first; this.second = second; } } // Function to return the minimum // number of operations required static int minOperations(int n, int []a, int m) { int k = n / m; // To store modulos values List<int> []val = new List<int>[m]; for(int i = 0; i < val.Length; i++) val[i] = new List<int>(); for(int i = 0; i < n; ++i) { val[a[i] % m].Add(i); } long ans = 0; List<pair> extra = new List<pair>(); for(int i = 0; i < 2 * m; ++i) { int cur = i % m; // If it's size greater than k // it needed to be decreased while ((val[cur].Count) > k) { int elem = val[cur][val[cur].Count - 1]; val[cur].RemoveAt(val[cur].Count - 1); extra.Add(new pair(elem, i)); } // If it's size is less than k // it needed to be increased while (val[cur].Count < k && extra.Count != 0) { int elem = extra[extra.Count - 1].first; int mmod = extra[extra.Count - 1].second; extra.RemoveAt(extra.Count - 1); val[cur].Add(elem); ans += i - mmod; } } return (int)ans; } // Driver code public static void Main(String[] args) { int m = 3; int []a = {3, 2, 0, 6, 10, 12}; int n = a.Length; Console.Write(minOperations(n, a, m)); } } // This code is contributed by Princi Singh
3
Publicación traducida automáticamente
Artículo escrito por pawan_asipu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA