Trucos de C++ para programación competitiva (para C++ 11)

Hemos discutido algunos trucos en la siguiente publicación. En esta publicación, se discuten algunos trucos más. Escribir código C/C++ de manera eficiente en la programación competitiva Aunque la práctica es la única forma de garantizar un mayor rendimiento en los concursos de programación, tener algunos trucos bajo la manga garantiza una ventaja superior y una depuración rápida. 

1) Verificar si el número es par o impar sin usar el operador %: aunque este truco no es mucho mejor que usar el operador % pero a veces es eficiente (con números grandes). Uso y operador: 

CPP

if (num & 1)
   cout << "ODD";
else
   cout << "EVEN";

Ejemplo: num = 5 Binario: “101 & 1” será 001, entonces verdadero num = 4 Binario: “100 & 1” será 000, entonces falso. 

2) Multiplicación o división rápida por 2 Multiplicar por 2 significa desplazar todos los bits a la izquierda y dividir por 2 significa desplazar a la derecha. Ejemplo: 2 (Binario 10): desplazamiento a la izquierda 4 (Binario 100) y a la derecha 1 (Binario 1) 

CPP

// Multiply n with 2
n = n << 1;
 
// Divide n by 2
n = n >> 1;

3) Intercambio de 2 números usando XOR: este método es rápido y no requiere el uso de una tercera variable. 

CPP

// A quick way to swap a and b
a ^= b;
b ^= a;
a ^= b;

4) Evitar el uso de strlen(): 

CPP

//  Use of strlen() can be avoided by:
for (i=0; s[i]; i++)
{
}
// loop breaks when the character array ends.

5) Uso de emplace_back() (Discutido aquí , aquí y aquí ) En lugar de push_back() en STL, se puede usar emplace_back porque es mucho más rápido y en lugar de asignar memoria en otro lugar y luego agregarlo directamente, asigna memoria en el contenedor. 

6) Función GCD incorporada: C++ tiene una función GCD incorporada y no es necesario codificarla explícitamente. Sintaxis: __gcd(x, y); 

7) Uso de funciones en línea: podemos crear funciones en línea y usarlas sin tener que codificarlas durante el concurso. Ejemplos: (a) función para tamiz, (b) función para palíndromo. 

8) Tamaño máximo de la array: debemos saber que el tamaño máximo de la array declarada dentro de la función principal es del orden de 10 ^ 6, pero si declara la array globalmente, puede declarar su tamaño hasta 10 ^ 7 . 

9) Cálculo del dígito más significativo: para calcular el dígito más significativo de cualquier número, el registro se puede usar directamente para calcularlo. Podemos calcular el número de dígitos y luego dividir el número por 10^(número de dígitos-1)

Suppose the number is N then 
Let int K = log10(N); // number of digits in a number=log10(N)+1
And int X = pow(10, K);
Then int ans=N/X will be the most significant digit

C++

#include <bits/stdc++.h>
using namespace std;
 
int MSD(int n){
      if(n == 0)
        return 0;
      int k = log10(n);
    int x = pow(10,k);
    int ans = n/x;
      return ans;
}
 
int main() {
    int n;
    cin >> n;
    cout << MSD(n) << endl;
    return 0;
}

10) Calcular la cantidad de dígitos directamente: para calcular la cantidad de dígitos en un número, en lugar de hacer un bucle, puede usar log de manera eficiente:

Number of digits in N =floor(log10(N)) + 1;  

11) Truco eficiente para saber si un número es potencia de 2 usando la técnica normal de división la complejidad resulta ser O(logN), pero se puede resolver usando O(v) donde v es el número de dígitos del número en forma binaria. 

CPP

/* Function to check if x is power of 2*/
bool isPowerOfTwo (int x)
{
  /* First x in the below expression is
    for the case when x is 0 */
  return x && (!(x&(x-1)));
}

12) C++ 11 tiene algoritmos incorporados para lo siguiente:

       // are all of the elements positive?
       all_of(first, first+n, ispositive()); 

      // is there at least one positive element?
      any_of(first, first+n, ispositive());

      // are none of the elements positive?
      none_of(first, first+n, ispositive()); 

Consulte los algoritmos de array en C++ STL (all_of, any_of, none_of, copy_n e itoa) para obtener más detalles. 

13) Algoritmo de copia: se utiliza para copiar elementos de un contenedor a otro.

int source[5] = {0, 12, 34, 50, 80};
int target[5];
// copy 5 elements from source to target
copy_n(source, 5, target);

Consulte los algoritmos de array en C++ STL (all_of, any_of, none_of, copy_n e itoa) para obtener más detalles. 

14) El algoritmo Iota El algoritmo iota() crea un rango de valores que aumentan secuencialmente, como si asignara un valor inicial a *primero, y luego incrementara ese valor usando el prefijo ++. En el siguiente listado, iota() asigna los valores consecutivos {10, 11, 12, 13, 14} al arreglo arr, y {‘a’, ‘b’, ‘c’} al arreglo char c[]. 

CPP

int a[5] = {0};
char c[3] = {0};
 
// changes a to {10, 11, 12, 13, 14}
iota(a, a+5, 10);
iota(c, c+3, 'a'); // {'a', 'b', 'c'}

Consulte los algoritmos de array en C++ STL (all_of, any_of, none_of, copy_n e itoa) para obtener más detalles. 

15) Inicialización en formato binario: En C++ 11 las asignaciones también se pueden realizar en formato binario. 

CPP

// C++ code to demonstrate working of
// "binary" numbers
#include<iostream>
using namespace std;
int main()
{
    auto number = 0b011;
    cout << number;
    return 0;
}

Producción :

3

16) Uso de «y» Aunque no es muy productivo, este consejo lo ayuda a usar el operador condicional y en lugar de escribir &. 

CPP

// C++ code to demonstrate working of "and"
#include<iostream>
using namespace std;
int main()
{
    int a = 10;
    if (a < 20 and a > 5)
      cout << "Yes";
    return 0;
}

Producción :

Yes

Este artículo es una contribución de Yash Kodesia . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu 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. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

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 *