logo

C/C++-koodin kirjoittaminen tehokkaasti kilpailevassa ohjelmoinnissa

Ensinnäkin sinun on tiedettävä Malli Makrot ja Vektorit ennen kuin siirryt seuraavaan vaiheeseen! 

  • Mallit ovat yleisen ohjelmoinnin perusta, joka sisältää koodin kirjoittamisen tavalla, joka on riippumaton tietystä tyypistä.
  • Makro on koodinpätkä, jolle on annettu nimi. Aina kun nimeä käytetään, se korvataan makron sisällöllä.
  • Vektorit ovat samoja kuin dynaamiset taulukot, joilla on mahdollisuus muuttaa itsensä kokoa automaattisesti, kun elementti lisätään tai poistetaan, ja säilö käsittelee niiden tallennustilan automaattisesti.


Joten voimme käyttää näitä tehokkaita työkaluja koodin kirjoittamiseen tehokkaalla tavalla.
Jotkut hienoista temppuista, joita voidaan käyttää kilpailullisessa ohjelmoinnissa, on esitetty seuraavasti: 

    Käyttämällä Range-pohjaista silmukkaa: Tämä on erittäin hieno ominaisuus C++11:ssä ja sitä pidettäisiin parhaana, jos haluat iteroida alusta loppuun. Tämä koodi näyttää, kuinka ranged for -silmukoita käytetään iteroitaessa taulukon ja vektorin läpi: 
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; } 

Lähtö:



0 1 2 3 4 1 2 3 4 5
    Alustusluettelo:Tätä tyyppiä käytetään C++-alustusluettelon arvojen käyttämiseen. Tässä kääntäjä rakentaa tämän tyyppiset objektit automaattisesti alustusluettelon ilmoituksista, joka on luettelo pilkuilla erotetuista elementeistä, jotka on suljettu aaltosulkeisiin. 
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; } 

Lähtö: 

One Two Three
    Maksimi- tai vähimmäisarvon määrittäminen:Tämä on hyödyllinen, jotta vältytään ylimääräiseltä vaivalla max()- tai min()-funktion kirjoittamisessa. 
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; } 

Lähtö:

Max value = 11 Min value = -9
    Nopea tulo/lähtö C/C++:ssa:Kilpailevassa ohjelmoinnissa sinun on luettava Input/Output mahdollisimman nopeasti arvokkaan ajan säästämiseksi. 
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

Lisätietoja nopeasta syötöstä ja lähdöstä Lue tämä artikkeli . 

    Makron käyttö silmukan tapaan: Ehkä ei olisi hyvä käyttää sellaisia ​​makroja, koska se heikentäisi koodin luettavuutta, mutta nopean koodin kirjoittamiseen sen riskin voi ottaa! 
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; } 

Lähtö  

4 5 6 9 22 11 5 6 9 22 11 11 22 9 6 5 4
    Käyttämällä "bits/stdc++.h":Sen sijaan, että lisäisit useita #include-rivejä, käytä vain #include Tiedostot sisältävät kaikki otsikkotiedostot, joita tarvitset kilpailevassa ohjelmoinnissa, mikä säästää paljon aikaasi.Säiliöt:Erilaisten säiliöiden, kuten vektoriluettelokartan jne., käyttö mahdollistaa ennalta määritettyjen toimintojen käytön ja pienentää koodin kokoa huomattavasti (useammin kuin ei).Nopea cin and cout:Jos käytät cin ja cout I/O:ssa, lisää vain seuraava rivi heti main(:n) jälkeen. 
std::ios_base::sync_with_stdio(false);
    auto:Automaattinen käyttö tietotyyppien ilmoittamiseen voi säästää paljon aikaa ohjelmointikilpailujen aikana. Kun muuttuja määritellään automaattiseksi kääntäjäksi, se määrittää sen tyypin käännösajan aikana.Kirjastot ja ennalta määritetyt toiminnot:Käyttämällä sisäänrakennettuja toimintoja, kuten __gcd(AB) swap _builtin_popcount(R) _builtin_clz(R) jne. missä niitä voidaan käyttää. Yritä oppia erilaisia ​​toimintoja, jotka ovat käytettävissä algoritmi C++-kirjasto. Ne ovat hyödyllisiä useimmiten ohjelmissa


Viime kädessä näiden älykkäiden temppujen avulla voit kirjoittaa koodin helposti mahdollisimman lyhyessä ajassa ja sanoissa.

Luo tietokilpailu