Πώς κέρδισα 3 στα 4 χρυσά μετάλλια στην Ολυμπιάδα Πληροφορικής

Πώς κέρδισα 3 στα 4 χρυσά μετάλλια στην Ολυμπιάδα Πληροφορικής

Προετοιμαζόμουν για τους τελικούς του Παγκόσμιου Πρωταθλήματος Google HashCode 2017. Αυτός είναι ο μεγαλύτερος διαγωνισμός με αλγοριθμικά προβλήματα που διοργανώνει η Google.

Άρχισα να μαθαίνω C++ από την αρχή στην ένατη δημοτικού. Δεν ήξερα τίποτα για προγραμματισμό, αλγόριθμους ή δομές δεδομένων. Κάποια στιγμή έγραψα την πρώτη γραμμή κώδικα. Επτά μήνες αργότερα, ο διαγωνισμός προγραμματισμού εμφανίστηκε στον ορίζοντα. Ήθελα να δω πόσο καλά λειτουργούσε το στυλ της εκμάθησης προγραμματισμού. Ήταν η τέλεια ευκαιρία.

Μετά από δύο ημέρες αγώνων ήρθαν τα αποτελέσματα: Κέρδισα το χρυσό μετάλλιο.

Σοκαρίστηκα. Ήμουν μπροστά από ανταγωνιστές με 5 χρόνια εμπειρίας. Ήξερα ότι είχα δουλέψει σκληρά, αλλά αυτό το επίτευγμα ξεπέρασε κάθε προσδοκία μου. Συνειδητοποίησα ότι ο αθλητικός προγραμματισμός ήταν το θέμα μου και ασχολήθηκα ασταμάτητα.

Ξέρω τι με οδήγησε στην επιτυχία και θέλω να το μοιραστώ μαζί σας.

Πώς κέρδισα 3 στα 4 χρυσά μετάλλια στην Ολυμπιάδα Πληροφορικής

Το άρθρο μεταφράστηκε με την υποστήριξη της EDISON Software, η οποία φροντίζει για την υγεία των προγραμματιστών και το πρωινό τουςΚαι αναπτύσσει προσαρμοσμένο λογισμικό.

Ποια γλώσσα προγραμματισμού να επιλέξετε

  • C++ - Συνιστάται ανεπιφύλακτα! Είναι πολύ γρήγορος. Η υλοποίηση των αλγορίθμων απαιτεί λίγο χρόνο λόγω STL. Η C++ είναι αποδεκτή σε όλους τους διαγωνισμούς. Έγραψα την πρώτη γραμμή κώδικα σε C++.
  • C - Μάθετε C++ λόγω του STL. Εάν γνωρίζετε C, μπορείτε επίσης να προγραμματίσετε σε C++.
  • Η Java είναι μια αργή γλώσσα προγραμματισμού. Έχει μια κατηγορία Big Integer, αλλά δεν θα σας βοηθήσει πολύ. Αν ένας διαγωνισμός έχει χρονικό όριο, με την Java σίγουρα θα το ξεπεράσεις. Η Java δεν είναι αποδεκτή σε όλους τους διαγωνισμούς.

Πού μπορείτε να εξασκηθείτε

προτείνω Sphere Online Judge (SPOJ). Είναι ένας αποτελεσματικός πόρος από άποψη ποσότητας και ποιότητας. Οι συντάκτες και οι λύσεις είναι διαθέσιμες στο διαδίκτυο εάν κολλήσετε στη διαδικασία επίλυσης προβλημάτων. Εκτός από αυτόν τον ιστότοπο προτείνω SPOJ Toolkit и ταξινομητής προβλημάτων για SPOJ.pl.

Πρώτα, πρέπει να βελτιώσετε τις γνώσεις σας για τα βασικά

Μόλις εξοικειωθείτε με τη σύνταξη της γλώσσας, υπάρχουν κάποια προβλήματα που πρέπει να ξεπεραστούν. Ξεκινήστε με απλά προβλήματα που απαιτούν εξάσκηση. Σε αυτό το στάδιο, το κύριο πράγμα είναι να καθορίσετε το στυλ προγραμματισμού σας. Ίσως σας αρέσει να γράφετε κώδικα με πολλά κενά, ίσως όχι. Μπορεί να βάζετε τις παρενθέσεις στην ίδια γραμμή με το "αν" ή μπορεί να τις βάζετε σε ξεχωριστές γραμμές.

Πρέπει να βρεις το στυλ προγραμματισμού σου γιατί είναι το δικό σου στυλ.

Όταν το αναζητάτε, θυμηθείτε δύο βασικές αρχές:

  • Ο κώδικάς σας θα πρέπει να είναι εύκολος στην εφαρμογή. Θα πρέπει να αισθάνεστε άνετα εφαρμόζοντας τη λύση που έχετε βρει. Γιατί; Γιατί κατά τη διάρκεια ενός διαγωνισμού, το τελευταίο πράγμα που θέλεις είναι να χαθείς στον κώδικά σου. Είναι πάντα καλύτερο να αφιερώνετε επιπλέον 5 λεπτά για να σκεφτείτε πώς να απλοποιήσετε την εφαρμογή του κώδικα παρά να αφιερώσετε 10 λεπτά προσπαθώντας να τον καταλάβετε.
  • Ο κώδικάς σας πρέπει να είναι ευανάγνωστος. Όταν ο κώδικας διαβάζεται εύκολα, είναι εύκολος ο εντοπισμός σφαλμάτων. Ας το παραδεχτούμε - σφάλματα συμβαίνουν συνέχεια. Ξέρεις αυτό το συναίσθημα όταν σου απομένουν 10 λεπτά και δεν μπορείς να βρεις το καταραμένο λάθος; Φυσικά και ναι. Για να αποφύγετε αυτήν την κατάσταση, γράψτε ευανάγνωστο κώδικα. Μόλις ξεκινήσετε τον εντοπισμό σφαλμάτων, ο κώδικας θα φαίνεται φυσικός και εύκολος στην κατανόηση.

Εδώ είναι ένα δικό μου παράδειγμα στυλ προγραμματισμού.

Πώς να βελτιώσετε τις αναπτυξιακές σας δεξιότητες

Εξάσκηση, εξάσκηση και περισσότερη εξάσκηση. Σας συνιστώ να επεξεργαστείτε τα πρώτα 250 πιο επιλύσιμα προβλήματα SPOJ. Λύστε τα με τη σειρά. Αφιερώστε τουλάχιστον μια ώρα σκεφτόμενοι τη λύση σε καθένα από αυτά.

Μην πείτε: «Αυτό το πρόβλημα είναι πολύ δύσκολο για μένα, θα προσπαθήσω να λύσω το επόμενο». Έτσι σκέφτονται οι χαμένοι.

Πάρτε ένα κομμάτι χαρτί και ένα μολύβι. Σκέψου το. Ίσως βρεις λύση, ίσως όχι. Τουλάχιστον, θα αναπτύξετε αλγοριθμική σκέψη. Εάν δεν μπορείτε να βρείτε μια λύση μέσα σε μια ώρα, αναζητήστε μια έτοιμη λύση στο φόρουμ ή σε άρθρα.

Τι θα πετύχετε με αυτή την προσέγγιση; Μάθετε να εφαρμόζετε γρήγορα τις ιδέες σας χρησιμοποιώντας κώδικα. Και μελετήστε κλασικά προβλήματα και αλγόριθμους.

Δεύτερον, πρέπει να κυριαρχήσετε αλγόριθμους και δομές δεδομένων

Ακολουθήστε μια ιεραρχική προσέγγιση. Ξεκίνησες να τρέχεις χωρίς να ξέρεις να περπατάς; Οχι. Μπορείτε να φτιάξετε έναν ουρανοξύστη χωρίς γερά θεμέλια; Οχι ξανά.

Δεν μπορείτε να αγνοήσετε τα βήματα στην πορεία μάθησης. Αν τα αγνοήσεις, θα μείνεις με κενά γνώσης. Με τον καιρό θα επιδεινωθούν.

Ξεκινήστε με θεμελιώδεις αλγόριθμους και δομές δεδομένων

Είναι δύσκολο να ξεκινήσεις. Ίσως επειδή δεν ξέρετε τι να σπουδάσετε πρώτα. Να γιατί Δημιούργησα ένα μάθημα βίντεο "Αλγόριθμοι και Δομές Δεδομένων". Κατά τη δημιουργία αυτού του μαθήματος, το βασίστηκα στο πώς θα ήθελα να διδασκόμουν. Η αντίδραση ήταν απίστευτη! Περισσότεροι από 3000 φοιτητές από περισσότερες από 100 χώρες εγγράφηκαν για το μάθημα τον πρώτο μήνα.

Εάν εργάζεστε για να λύσετε εύκολα προβλήματα, δεν θα βελτιωθείτε ποτέ.

Ο πιο αποτελεσματικός τρόπος για να καταλάβεις αυτό που δεν ξέρεις είναι να το βιώσεις στην πράξη. Έτσι έμαθα. Έμαθα πολλές νέες τεχνικές για τις οποίες δεν είχα ξανακούσει επιλέγοντας μια δύσκολη εργασία.

Κάθε τρίτο πρόβλημα που εργάζεστε πρέπει να σας διδάσκει κάτι νέο. Να είστε πιο προσεκτικοί όταν επιλέγετε προβλήματα. Επιλέξτε πιο δύσκολα προβλήματα!

Μόλις ολοκληρώσετε αυτά τα 250 προβλήματα από το SPOJ, θα έχετε μια βασική κατανόηση των βασικών θεμάτων του αθλητικού προγραμματισμού. Με μια βαθιά κατανόηση της λογικής πίσω από τους βασικούς αλγόριθμους, οι αλγόριθμοι υψηλού επιπέδου θα φαίνονται λιγότερο περίπλοκοι. Με αυτόν τον τρόπο μπορείτε να αξιοποιήσετε στο έπακρο τις γνώσεις σας.

Σκάψτε βαθύτερα σε καθένα από τα κύρια θέματα

Εδώ είναι ένας πολύτιμος πόρος με πολλές πληροφορίες. Εκεί θα βρείτε τους 10 κορυφαίους αλγόριθμους και δομές δεδομένων για κάθε θέμα. Μετά από 250 προβλήματα από το SPOJ, θα γνωρίζετε πολλά από αυτή τη λίστα. Αλλά θα σκοντάψετε και σε πολλά πράγματα που δεν έχετε ξανακούσει. Ξεκινήστε λοιπόν να μελετάτε αυτά τα θέματα με αύξουσα σειρά.

Αν δεν ενισχύσετε τις γνώσεις σας αφού μάθετε κάτι νέο, θα ξεχάσετε γρήγορα τα πάντα.
Σας συνιστώ, αφού μάθετε έναν νέο αλγόριθμο, να τον χρησιμοποιήσετε στην πράξη. Δουλέψτε το με 2-3 εργασίες. Αναζητήστε την ετικέτα αλγορίθμου στο SPOJ. Εκεί θα βρείτε προβλήματα που χρειάζονται αυτόν τον αλγόριθμο για να λυθούν. Αντιμετωπίστε πρώτα αυτά τα ζητήματα.

Μάθετε τον Δυναμικό Προγραμματισμό γιατί θα σας οδηγήσει στη νίκη
Από την εμπειρία μου, κάθε διαγωνισμός έχει τουλάχιστον ένα πρόβλημα δυναμικός προγραμματισμός. Πολλοί άνθρωποι έχουν πονοκέφαλο όταν ακούν τη φράση «δυναμικός προγραμματισμός» επειδή δεν την καταλαβαίνουν καθόλου.

Και αυτό είναι καλό. Γιατί αν καταλαβαίνεις δυναμικό προγραμματισμό, τότε θα κερδίσεις.

Μου αρέσει ο δυναμικός προγραμματισμός, είναι το αγαπημένο μου θέμα. Το μυστικό του δυναμικού προγραμματισμού είναι να κάνετε βέλτιστες σε παγκόσμιο επίπεδο επιλογές, όχι μόνο τοπικές. Πρέπει να αναλύσετε το πρόβλημα σε πιο απλά υποπροβλήματα. Λύστε καθένα από αυτά τα υποπροβλήματα μόνο μία φορά. Στη συνέχεια, δημιουργήστε μια λύση που συνδυάζει τα λυμένα υποπροβλήματα. Άπληστος αλγόριθμος - το αντίθετο του δυναμικού προγραμματισμού. Απαιτεί να κάνετε τοπικά βέλτιστες επιλογές σε κάθε βήμα. Και μια τοπικά βέλτιστη επιλογή μπορεί να οδηγήσει σε μια κακή παγκόσμια λύση.

Ενώ μαθαίνετε νέες έννοιες, ελέγξτε έξω Οδηγίες TopCoder. Είναι πολύ αναλυτικά και κατανοητά. Χάρη σε αυτούς μπόρεσα να καταλάβω δυαδικά ευρετηριασμένα δέντρα.

Δούλεψε σκληρά

Έχετε ακούσει ποτέ για αθλητές που κερδίζουν τους Ολυμπιακούς Αγώνες χωρίς χρόνια προπόνησης; Εγώ όχι.

Κάθε χρόνο, οι προετοιμασίες για την Ολυμπιάδα Πληροφορικής ξεκινούσαν τον Σεπτέμβριο και τελείωναν τον Απρίλιο.

Κάθε μέρα αυτούς τους 8 μήνες έκανα 5 ώρες προπόνηση.

Και ναι, πέρασα αυτές τις 5 ώρες μόνο λύνοντας αλγοριθμικά προβλήματα. Θυμάμαι τις μέρες που έκανα εξάσκηση για 8 και μάλιστα 10 ώρες. Γιατί; Γιατί μου άρεσε. Κάθε μέρα όταν επέστρεφα σπίτι από το σχολείο, πήγαινα κατευθείαν στην κρεβατοκάμαρα, καθόμουν στον υπολογιστή και άρχισα να αναλύω ένα νέο πρόβλημα. Ή μάθαινα έναν νέο αλγόριθμο που έπρεπε να γνωρίζω για να λύσω αυτό το πρόβλημα.

Αν θέλεις να κερδίσεις, πρέπει να κάνεις το ίδιο. Επιλέξτε ένα πρόβλημα και επιμείνετε σε αυτό. Σκεφτείτε το όταν περπατάτε στο σούπερ μάρκετ ή ενώ οδηγείτε.

Πώς κέρδισα 3 στα 4 χρυσά μετάλλια στην Ολυμπιάδα Πληροφορικής

Γνωρίζατε ότι όταν κοιμάστε, ο εγκέφαλός σας ανασυγκροτεί τις πληροφορίες που συλλέγονται εκείνη την ημέρα; Φαίνεται να στοιβάζει βιβλία με αλφαβητική σειρά σε ένα ράφι. Ουσιαστικά, ο εγκέφαλός σας σκέφτεται τα διάφορα προβλήματα που αντιμετωπίζετε.

Αυτό μπορεί να χρησιμοποιηθεί επιδέξια. Πριν πάτε για ύπνο, διαβάστε ένα δύσκολο πρόβλημα και θυμηθείτε τι χρειάζεται για να το λύσετε. Σε αυτό το στάδιο, δεν χρειάζεται να αναζητήσετε την ίδια τη λύση. Πήγαινε στο κρεβάτι. Ο εγκέφαλός σας θα αρχίσει να επεξεργάζεται αυτό το πρόβλημα. Όταν ξυπνήσετε, θα εκπλαγείτε όταν συνειδητοποιήσετε ότι βρήκατε τη λύση ενώ κοιμόσασταν.

Δοκιμάστε το μόνοι σας. Είναι σαν μαγεία.

Δημιούργησα ένα βίντεο blog

Πώς κέρδισα 3 στα 4 χρυσά μετάλλια στην Ολυμπιάδα Πληροφορικής

Αυτή η σύντομη παράγραφος δεν σχετίζεται με τον αθλητικό προγραμματισμό. Εάν είστε στα είκοσί σας και αναρωτιέστε πώς βλέπω τον κόσμο, ίσως θέλετε να το ελέγξετε το βιντεομπλογκ μου στο Youtube. Μιλάω για τον κόσμο, τη ζωή και την επιστήμη των υπολογιστών σε αυτόν.

Δούλεψε έξυπνα

Αυτό είναι το μυστικό της επιτυχίας. Χρειάζεσαι στόχους.

Άνθρωποι είμαστε και μας αρέσει χρονοτριβώ. Θέλουμε πάντα να αναβάλλουμε αυτό που πρέπει να γίνει αυτή τη στιγμή. Η παρακολούθηση του Netflix είναι πάντα πιο ευχάριστη από την αντιμετώπιση προβλημάτων δυναμικού προγραμματισμού. Το ξέρεις αυτό και πρέπει να το διορθώσεις.

Πώς να νικήσετε την αναβλητικότητα

Βάλτε στόχους στον εαυτό σας. Θα βρίσκετε πάντα ενδιαφέροντα προβλήματα από τα οποία μπορείτε να μάθετε κάτι νέο (δείτε τους πόρους που ανέφερα παραπάνω). Αλλά αυτά τα προβλήματα πρέπει να λυθούν, όχι απλώς να διαβάζονται.

Να λοιπόν πώς ξεπέρασα την αναβλητικότητα. Ξεκίνησα ένα έντυπο ημερολόγιο και γέμιζα κάθε μέρα με προβλήματα που ήθελα να λύσω. Πάντα συμπλήρωνα προβλήματα δύο μέρες νωρίτερα. Έτσι ήξερα πώς να διαχειρίζομαι τον χρόνο μου τις επόμενες μέρες.

Πώς κέρδισα 3 στα 4 χρυσά μετάλλια στην Ολυμπιάδα Πληροφορικής

Οπότε είχα πάντα κίνητρο. Έπρεπε να λύσω κάποια προβλήματα και να βρω νέα για να συμπληρώσω τις επόμενες μέρες στο ημερολόγιο. Η διασταύρωση λυμένων προβλημάτων είναι υπέροχη. Ξέρω ότι σου αρέσει κι εσένα.

Αποκτήστε το δικό σας έντυπο ημερολόγιο. Μην δημιουργήσετε άλλη λίστα υποχρεώσεων στο τηλέφωνό σας που θα ξεχάσετε αύριο.

Πώς να διορθώσετε αποτελεσματικά

Θέλεις να γίνεις επαγγελματίας; Εάν ναι, τότε θα πρέπει να το "ξεσφαλίσετε στο μυαλό σας".
Αυτή είναι μακράν η πιο αποτελεσματική τεχνική εντοπισμού σφαλμάτων που γνωρίζω γιατί δεν απαιτεί καθόλου πρόγραμμα εντοπισμού σφαλμάτων. Ο εγκέφαλός σας εξετάζει πολλαπλούς κλάδους κώδικα ταυτόχρονα και σας δίνει μια πολύ ευρύτερη επισκόπηση του κώδικα σε σύγκριση με κλασικό πρόγραμμα εντοπισμού σφαλμάτων.

Μπορείτε να συγκρίνετε τον εαυτό σας με έναν grandmaster που παίζει σκάκι και σκέφτεται 3 κινήσεις μπροστά.

Χρησιμοποιώ αυτή την τεχνική αποκλειστικά ως αρχική γραμμή άμυνας. Στη συνέχεια χρησιμοποιώ ένα πραγματικό πρόγραμμα εντοπισμού σφαλμάτων.

Για να μάθετε πώς να διορθώνετε σφάλματα στο κεφάλι σας, πρέπει να εξασκηθείτε. Όταν επικυρώνετε μια λύση σε ένα πρόβλημα και λαμβάνετε μια "λάθος απάντηση", μην πηγαίνετε απευθείας στο κουμπί εντοπισμού σφαλμάτων. Ξαναδιαβάστε τον κώδικα και σκεφτείτε: «Τι συμβαίνει σε αυτή τη γραμμή;», «Πώς επηρεάζει το «αν» εδώ το πρόγραμμα;», «Όταν βγαίνουμε από τον βρόχο, ποια είναι η τιμή του επαναλήπτη;»

Με αυτόν τον τρόπο σκέφτεσαι μόνος σου. Με τον καιρό, θα μάθετε να γράφετε κώδικα και να τον διορθώνετε αμέσως.

Σχετικά με τον συγγραφέα

Πώς κέρδισα 3 στα 4 χρυσά μετάλλια στην Ολυμπιάδα Πληροφορικής
Ο Andrei Margeloiu είναι ένας άπληστος προγραμματιστής με ενδιαφέρον για την επιχειρηματικότητα, τις νεοφυείς επιχειρήσεις και την ύπαιθρο. Μπορείτε να επικοινωνήσετε μαζί του στο LinkedIn.

Μετάφραση: Diana Sheremyeva

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο