Bagaimana Saya Memenangkan 3 dari 4 Medali Emas di Olimpiade Komputasi

gambar

Saya sedang bersiap-siap untuk Final Piala Dunia Google HashCode 2017. Ini adalah kontes terbesar dengan masalah algoritme yang diselenggarakan oleh Google.

Saya mulai belajar C ++ dari awal di kelas sembilan. Saya tidak tahu apa-apa tentang pemrograman, algoritma, dan struktur data. Pada titik tertentu, saya menulis baris kode pertama saya. Tujuh bulan kemudian, Olimpiade pemrograman menjulang di cakrawala. Saya ingin tahu seberapa baik gaya belajar saya bekerja. Itu adalah kesempatan yang ideal.

Setelah dua hari kompetisi, hasilnya datang: Saya memenangkan medali emas.

Saya kaget. Saya unggul dari pesaing dengan pengalaman 5 tahun. Saya tahu bahwa saya bekerja keras, tetapi pencapaian ini melebihi semua harapan saya. Saya menyadari bahwa pemrograman olahraga adalah topik saya dan pergi ke sana dengan kepala saya.

Saya tahu apa yang membuat saya sukses dan ingin berbagi dengan Anda.

Perangkat Lunak EDISON - pengembangan web
Artikel ini diterjemahkan dengan dukungan Perangkat Lunak EDISON, yang menjaga kesehatan programmer dan sarapan mereka , dan juga mengembangkan perangkat lunak khusus .


Bahasa pemrograman mana yang harus dipilih


  • C ++ - Sangat Dianjurkan! Dia sangat cepat. Implementasi algoritma membutuhkan sedikit waktu karena STL. C ++ diterima di semua kompetisi. Saya menulis baris kode pertama saya di C ++.
  • C - belajar C ++ karena STL. Jika Anda tahu C, Anda juga bisa memprogram dalam C ++.
  • Java adalah bahasa pemrograman yang lambat. Ini memiliki kelas Big Integer, tetapi tidak terlalu membantu Anda. Jika kompetisi memiliki batas waktu, Anda mungkin akan melampauinya dengan Java. Java tidak diterima di semua kompetisi.


Di mana Anda bisa berlatih


Saya merekomendasikan Hakim Sphere Online (SPOJ) . Ini adalah sumber daya yang efektif dalam hal kuantitas dan kualitas. Editor dan solusi tersedia online jika Anda terjebak dalam proses penyelesaian masalah. Selain situs ini, saya merekomendasikan SPOJ Toolkit dan penggolong masalah untuk SPOJ.pl.

Pertama, Anda perlu mengasah dasar-dasarnya


Setelah Anda terbiasa dengan sintaks bahasa, Anda harus menyelesaikan beberapa masalah. Mulailah dengan masalah sederhana yang membutuhkan latihan. Pada tahap ini, yang utama adalah menentukan gaya pemrograman Anda. Mungkin Anda suka menulis kode dengan banyak spasi, atau mungkin tidak. Mungkin Anda meletakkan tanda kurung pada baris yang sama dengan "jika," atau Anda dapat menempatkannya pada baris yang berbeda.

Anda harus menemukan gaya pemrograman Anda karena itu gaya ANDA.

Ketika Anda mencarinya, jangan lupakan dua prinsip dasar:

  • Kode Anda harus mudah diimplementasikan. Anda harus merasa nyaman menerapkan solusi yang Anda buat. Mengapa Karena selama kompetisi, hal terakhir yang Anda inginkan adalah tersesat dalam kode Anda. Itu selalu lebih baik untuk berpikir tentang bagaimana menyederhanakan implementasi kode, daripada menghabiskan 10 menit untuk mengetahuinya.
  • Kode Anda harus mudah dibaca. Ketika kode mudah dibaca, mudah untuk di-debug. Mari kita hadapi itu - kesalahan muncul terus-menerus. Apakah Anda tahu perasaan yang sangat ketika 10 menit tersisa sampai akhir dan Anda tidak dapat menemukan kesalahan sialan? Tentu saja kamu tahu. Untuk menghindari situasi ini, tulis kode yang dapat dibaca. Ketika Anda mulai men-debug-nya, kodenya akan tampak alami dan mudah dimengerti.


Ini adalah contoh gaya pemrograman saya .

Cara meningkatkan keterampilan pengembangan Anda


Berlatih, berlatih dan berlatih lagi. Saya sarankan Anda mengerjakan 250 tugas pertama yang paling diselesaikan di SPOJ . Selesaikan mereka secara berurutan. Luangkan setidaknya satu jam untuk merenungkan solusi untuk masing-masing solusi.

Jangan katakan: "Masalah ini terlalu rumit bagi saya, saya akan coba selesaikan berikut ini." Jadi pecundang berpikir.

Ambil selembar kertas dan pensil. Pikirkan tentang itu. Mungkin Anda bisa menemukan solusinya, atau mungkin juga tidak. Minimal, Anda akan mengembangkan pemikiran algoritmik. Jika Anda tidak dapat menemukan solusi dalam waktu satu jam, cari solusi yang sudah jadi di forum atau di artikel.

Apa yang akan Anda capai dengan pendekatan ini? Pelajari cara menerapkan ide-ide Anda dengan cepat dengan kode. Dan pelajari masalah dan algoritma klasik.

Kedua, Anda harus menguasai algoritma dan struktur data


Ikuti pendekatan hierarkis. Apakah Anda mulai berlari tanpa berjalan? Tidak. Bisakah Anda membangun gedung pencakar langit tanpa dasar yang kuat? Tidak lagi.

Anda tidak dapat mengabaikan langkah-langkah di jalur pembelajaran. Jika Anda mengabaikannya, Anda masih akan memiliki kesenjangan pengetahuan. Seiring waktu, mereka hanya akan memburuk.

Mulailah dengan algoritma dasar dan struktur data


Sulit untuk memulai. Mungkin karena Anda tidak tahu harus belajar apa dulu. Oleh karena itu, saya membuat kursus video "Algoritma dan Struktur Data." Dalam membuat kursus ini, saya mengandalkan bagaimana saya ingin diajar. Reaksinya luar biasa! Lebih dari 3.000 siswa dari lebih dari 100 negara mendaftar untuk kursus di bulan pertama.

Jika Anda berusaha memecahkan masalah yang mudah, Anda tidak akan pernah menjadi lebih baik.

Cara paling efektif untuk mengetahui apa yang tidak Anda ketahui adalah menjalankannya dalam praktik. Jadi saya belajar. Saya belajar banyak teknik baru yang belum pernah saya dengar sebelumnya, memilih tugas yang sulit.

Setiap masalah ketiga yang sedang Anda kerjakan harus mengajarkan Anda sesuatu yang baru. Hati-hati saat memilih masalah. Pilih masalah yang lebih sulit!

Setelah Anda menyelesaikan 250 tugas ini dari SPOJ, Anda akan memiliki pemahaman yang sama tentang topik utama pemrograman olahraga. Berkat pemahaman mendalam tentang logika yang mendasari algoritma dasar, algoritma tingkat tinggi akan tampak kurang rumit. Dengan demikian, Anda bisa menggunakan pengetahuan Anda secara maksimal.

Gali lebih dalam ke masing-masing topik utama.


Ini adalah sumber daya berharga dengan banyak informasi. Di sana Anda akan menemukan 10 algoritma dan struktur data teratas untuk setiap topik. Setelah 250 masalah dari SPOJ Anda akan tahu banyak dari daftar ini. Tetapi juga menemukan banyak hal yang belum pernah terdengar sebelumnya. Oleh karena itu, mulailah menjelajahi topik ini dalam urutan menaik.

Jika Anda tidak memperkuat pengetahuan Anda setelah Anda mempelajari sesuatu yang baru, Anda akan segera melupakan segalanya.
Saya merekomendasikan bahwa setelah Anda mempelajari algoritma baru, gunakan dalam praktiknya. Kerjakan pada 2-3 tugas. Cari tag algoritme di SPOJ. Di sana Anda akan menemukan masalah untuk solusi yang membutuhkan algoritma ini. Urutkan masalah ini terlebih dahulu.

Berurusan dengan pemrograman yang dinamis karena itu akan membawa Anda ke kemenangan
Berdasarkan pengalaman saya, dalam setiap kompetisi setidaknya ada satu masalah pemrograman dinamis . Banyak orang sakit kepala ketika mendengar frasa "pemrograman dinamis" karena mereka tidak memahaminya sama sekali.

Dan itu bagus. Karena jika Anda mengerti pemrograman dinamis, maka Anda akan menang.

Saya suka pemrograman dinamis, ini adalah topik favorit saya. Rahasia pemrograman dinamis adalah membuat pilihan yang optimal secara global, bukan hanya pilihan lokal. Anda harus memecah masalah menjadi beberapa subtugas sederhana. Selesaikan masing-masing subtugas ini hanya sekali. Kemudian buat solusi yang menggabungkan subtugas diselesaikan. Algoritma serakah adalah kebalikan dari pemrograman dinamis. Di dalamnya, Anda perlu membuat pilihan yang optimal secara lokal di setiap langkah. Pilihan yang optimal secara lokal dapat mengarah pada solusi global yang buruk.

Ketika Anda menjelajahi konsep-konsep baru, lihat tutorial TopCoder . Mereka sangat terperinci dan dapat dimengerti. Berkat mereka, saya bisa memahami pohon indeks biner .

Bekerja keras


Pernahkah Anda mendengar tentang atlet yang memenangkan Olimpiade tanpa latihan selama bertahun-tahun? Saya tidak.

Setiap tahun, persiapan untuk olimpiade komputer dimulai pada bulan September dan berakhir pada bulan April.

Setiap hari selama 8 bulan ini saya berlatih selama 5 jam.

Dan ya, saya menghabiskan 5 jam ini hanya untuk menyelesaikan masalah algoritmik. Saya ingat hari-hari ketika saya berlatih selama 8 dan bahkan 10 jam. Mengapa Karena saya menyukainya. Setiap hari, sepulang dari sekolah, saya langsung ke kamar tidur, duduk di depan komputer dan mulai memilah-milah masalah baru. Atau pelajari algoritma baru yang perlu Anda ketahui untuk menyelesaikan masalah ini.

Jika Anda ingin menang, Anda harus melakukan hal yang sama. Pilih masalah dan patuhi itu. Pikirkan tentang hal ini saat berjalan di sepanjang jalan ke supermarket atau saat mengemudi.

gambar

Apakah Anda tahu bahwa selama tidur otak Anda defragment informasi yang dikumpulkan pada hari ini? Dia tampaknya menumpuk buku dalam urutan abjad di rak buku. Intinya, otak Anda memikirkan berbagai masalah yang Anda temui.

Ini bisa digunakan dengan terampil. Sebelum tidur, bacalah masalah yang sulit dan ingat apa yang Anda butuhkan untuk menyelesaikannya. Pada titik ini Anda tidak perlu mencari solusinya sendiri. Tidurlah. Otak Anda akan mulai menangani masalah ini. Ketika Anda bangun, Anda akan terkejut menyadari bahwa Anda telah menemukan solusi saat Anda sedang tidur.

Coba sendiri. Itu terlihat seperti sihir.

Saya membuat blog video


gambar

Paragraf pendek ini tidak terkait dengan pemrograman olahraga. Jika Anda berusia lebih dari dua puluh tahun, dan Anda tertarik pada cara saya melihat dunia, maka Anda dapat menonton blog video saya di Youtube . Saya berbicara tentang dunia, kehidupan, dan ilmu komputer.

Bekerjalah dengan bijak


Inilah rahasia kesuksesan. Anda butuh tujuan.

Kami adalah orang-orang dan kami suka menunda - nunda . Kami selalu ingin menunda apa yang perlu dilakukan sekarang. Menonton Netflix selalu lebih baik daripada berurusan dengan masalah pemrograman yang dinamis. Anda tahu itu, dan Anda harus memperbaikinya.

Bagaimana cara mengalahkan penundaan


Tetapkan tujuan untuk diri sendiri. Anda akan selalu menemukan masalah menarik dari mana Anda dapat mempelajari sesuatu yang baru (lihat sumber daya yang saya sebutkan di atas). Tetapi masalah-masalah ini perlu diselesaikan, tidak hanya membaca tentang mereka.

Jadi, beginilah cara saya mengatasi penundaan. Saya memulai kalender kertas dan mengisi setiap hari dengan masalah yang ingin saya selesaikan. Saya selalu mengisi masalah di muka, dua hari sebelumnya. Karena itu, saya tahu bagaimana mengatur waktu saya di hari-hari berikutnya.

gambar

Jadi, saya selalu punya motivasi. Saya perlu menyelesaikan beberapa masalah dan mencari yang baru untuk mengisi hari-hari berikutnya di kalender. Menyingkirkan masalah yang diselesaikan sangat bagus. Saya tahu Anda juga menyukainya.

Dapatkan kalender kertas Anda sendiri. Jangan membuat daftar tugas lain di ponsel yang akan Anda lupakan besok.

Cara debut yang efektif


Ingin menjadi seorang profesional? Jika demikian, maka Anda perlu merendahkan dalam pikiran.
Sejauh ini, ini adalah teknik debugging paling efektif yang saya tahu, karena tidak memerlukan debugger sama sekali. Otak Anda memeriksa beberapa cabang kode secara bersamaan dan memberi Anda gambaran umum kode yang lebih luas dibandingkan dengan debugger klasik .

Anda dapat membandingkan diri Anda dengan grandmaster yang bermain catur dan berpikir 3 langkah ke depan.

Saya menggunakan teknik ini semata-mata sebagai garis pertahanan awal saya. Lalu saya menggunakan debugger nyata.

Untuk mempelajari cara merendahkan dalam pikiran, seseorang perlu berlatih. Saat Anda menyetujui solusi untuk masalah dan mendapatkan "jawaban salah", jangan langsung ke tombol debugger. Baca ulang kode dan pikirkan: "Apa yang terjadi pada baris ini?", "Bagaimana" jika "mempengaruhi program?", "Ketika kita keluar dari loop, berapakah nilai iterator?".

Jadi, Anda berpikir sendiri. Seiring waktu, Anda akan belajar cara menulis kode dan memulai debutnya saat bepergian.

Tentang penulis

gambar
Andrei Margeloiu adalah seorang programmer yang tertarik pada kewirausahaan, startup dan alam. Anda dapat menghubunginya di LinkedIn .

Terjemahan: Diana Sheremyova


Baca juga blognya
Perusahaan EDISON:


20 perpustakaan untuk
aplikasi iOS yang spektakuler

Source: https://habr.com/ru/post/id473590/


All Articles