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  -1    0  )         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