logo

Escriptura de codi C/C++ de manera eficient en programació competitiva

Primer de tot, cal saber Plantilla Macros i Vectors abans de passar a la següent fase! 

  • Les plantilles són la base de la programació genèrica que implica escriure codi d'una manera independent de qualsevol tipus en particular.
  • Una macro és un fragment de codi al qual se li ha donat un nom. Sempre que s'utilitza el nom, se substitueix pel contingut de la macro.
  • Els vectors són els mateixos que les matrius dinàmiques amb la possibilitat de redimensionar-se automàticament quan s'insereix o s'elimina un element amb el seu emmagatzematge gestionat automàticament pel contenidor.


Així podem utilitzar aquestes potents eines per escriure el nostre codi d'una manera eficaç.
Alguns dels trucs interessants que es poden utilitzar a la programació competitiva es donen de la següent manera: 

    Utilitzant el bucle for basat en el rang: Aquesta és una característica molt interessant en C++11 i es consideraria la millor si voleu iterar des del principi fins al final. Aquest codi mostra com utilitzar els bucles ranged for per iterar per una matriu i un vector: 
CPP
// C++ program to demonstrate range based for // loops for accessing vector and array elements #include   #include  using namespace std; int main() {  // Create a vector object that  // contains 5 elements  vector<int> vec = {0 1 2 3 4};  // Type inference by reference using auto.  // Range based loops are preferred when no  // modification is needed in value  for (const auto &value : vec)  cout << value << ' ';  cout << 'n';  // Basic 5 element integer array  int array[]= {1 2 3 4 5};  for (const auto &value: array)  cout << value << ' ';  return 0; } 

Sortida:



0 1 2 3 4 1 2 3 4 5
    Llista d'inicialitzadors:Aquest tipus s'utilitza per accedir als valors d'una llista d'inicialització de C++. Aquí els objectes d'aquest tipus són construïts automàticament pel compilador a partir de declaracions de llista d'inicialització que és una llista d'elements separats per comes tancats entre claus. 
CPP
#include   template<typename T> void printList(std::initializer_list<T> text) {  for (const auto & value: text)  std::cout << value << ' '; } // Driver program int main() {  // Initialization list  printList( {'One' 'Two' 'Three'} );  return 0; } 

Sortida: 

One Two Three
    Assignació d'un valor màxim o mínim:Aquest és útil per evitar un esforç addicional en escriure la funció max() o min(). 
CPP
#include   // Call by reference is used in x template<typename T typename U> static inline void amin(T &x U y) {  if (y < x)  x = y; } // call by reference is used in x template<typename T typename U> static inline void amax(T &x U y) {  if (x < y)  x = y; } // Driver program to find the Maximum and Minimum value int main() {  int max_val = 0 min_val = 1e5;  int array[]= {4 -5 6 -9 2 11};  for (auto const &val: array)  // Same as max_val = max (max_val val)  // Same as min_val = min (min_valval)  amax(max_val val) amin (min_val val);  std::cout << 'Max value = ' << max_val << 'n'  << 'Min value = ' << min_val;  return 0; } 

Sortida:

Max value = 11 Min value = -9
    Entrada/sortida ràpida en C/C++:A la programació competitiva heu de llegir l'entrada/sortida el més ràpid possible per estalviar un temps valuós. 
C
#include    template<typename T> void scan(T &x) {  x = 0;  bool neg = 0;  register T c = getchar();  if (c == '-')  neg = 1 c = getchar();  while ((c < 48) || (c > 57))  c = getchar();  for ( ; c < 48||c > 57 ; c = getchar());  for ( ; c > 47 && c < 58; c = getchar() )  x= (x << 3) + ( x << 1 ) + ( c & 15 );  if (neg) x *= -1; } template<typename T> void print(T n) {  bool neg = 0;  if (n < 0)  n *= -1 neg = 1;  char snum[65];  int i = 0;  do  {  snum[i++] = n % 10 + '0';  n /= 10;  }  while (n);  --i;  if (neg)  putchar('-');  while (i >= 0)  putchar(snum[i--]);  putchar('n'); } // Driver Program int main() {  int value;  // Taking input  scan(value);  // Printing output  print(value);  return 0; } 
Input: 756 Output: 756

Per saber més sobre l'entrada i sortida ràpides Llegeix aquest article . 

    Utilitzant macros com for bucle: Potser no seria bo utilitzar aquestes macros, ja que reduiria la llegibilitat del codi, però per escriure codi ràpid podeu córrer aquest risc! 
CPP
#include    using namespace std; #define rep(in) for (i = 0; i < n; ++i) #define REP(ikn) for (i = k; i <= n; ++i) #define REPR(ikn) for (i = k; i >= n; --i) // Driver program to test above Macros int main() {  int i;  int array[] = {4 5 6 9 22 11};  int size= sizeof(array)/sizeof(array[0]);    // Default 0 index based loop  rep(i size)   cout << array[i] << ' ';  cout<<'n';    // Starting index based loop  REP(i 1 size-1)   cout << array[i] << ' ';  cout<<'n';    // Reverse for loop  REPR(i size-10)   cout << array[i] << ' ';  return 0; } 

Sortida  

4 5 6 9 22 11 5 6 9 22 11 11 22 9 6 5 4
    Utilitzant "bits/stdc++.h":En lloc d'afegir tones de línies #include només cal que utilitzeu #include Els fitxers inclouen tots els fitxers de capçalera que necessitareu en la programació competitiva, estalviant molt de temps.Contenidors:L'ús de diversos contenidors, com ara el mapa de llista vectorial, etc., permet utilitzar les funcions predefinides i redueix considerablement la mida del codi (la majoria de vegades)Cin i cout ràpids:Si utilitzeu cin i cout per a E/S només cal que afegiu la línia següent just després de main(). 
std::ios_base::sync_with_stdio(false);
    automàtic:L'ús de l'auto per declarar tipus de dades pot estalviar molt de temps durant els concursos de programació. Quan una variable es defineix com a compilador automàtic, determina el seu tipus durant el temps de compilació.Biblioteques i funcions predefinides:Utilitzant funcions integrades com ara __gcd(AB) swap _builtin_popcount(R) _builtin_clz(R) etc. allà on es pugui aplicar. Intenta aprendre diferents funcions disponibles a algorisme biblioteca de C++. Són útils la majoria de vegades en programes


En última instància, utilitzant aquests trucs intel·ligents, podeu escriure codi fàcilment en un mínim de temps i paraules.

Crea un qüestionari