Bagaimana saya memenangi 3 daripada 4 pingat emas di Olimpik Pengkomputeran

Bagaimana saya memenangi 3 daripada 4 pingat emas di Olimpik Pengkomputeran

Saya sedang bersiap untuk Pertandingan Akhir Kejohanan Dunia Google HashCode 2017. Ini adalah pertandingan cabaran algoritma terbesar yang dianjurkan oleh Google.

Saya mula belajar C++ dari awal pada gred sembilan. Saya tidak tahu apa-apa tentang pengaturcaraan, algoritma atau struktur data. Pada satu ketika saya menulis baris pertama kod saya. Tujuh bulan kemudian, pertandingan pengaturcaraan muncul di kaki langit. Saya ingin melihat sejauh mana gaya pembelajaran pengaturcaraan saya berfungsi. Ia adalah peluang yang sempurna.

Selepas dua hari pertandingan, keputusan datang: Saya memenangi pingat emas.

Saya terperanjat. Saya mendahului pesaing dengan pengalaman 5 tahun. Saya tahu saya telah bekerja keras, tetapi pencapaian ini melebihi jangkaan saya. Saya menyedari bahawa pengaturcaraan sukan adalah topik saya dan menyelaminya secara berterusan.

Saya tahu apa yang membawa saya kepada kejayaan dan saya ingin berkongsi dengan anda.

Bagaimana saya memenangi 3 daripada 4 pingat emas di Olimpik Pengkomputeran

Artikel tersebut telah diterjemahkan dengan sokongan Perisian EDISON, yang menjaga kesihatan pengaturcara dan sarapan pagi merekaDan membangunkan perisian tersuai.

Bahasa pengaturcaraan mana yang hendak dipilih

  • C++ - Sangat mengesyorkan! Dia sangat pantas. Pelaksanaan algoritma mengambil sedikit masa kerana STL. C++ diterima dalam semua pertandingan. Saya menulis baris pertama kod saya dalam C++.
  • C - Belajar C++ kerana STL. Jika anda tahu C, anda juga boleh memprogram dalam C++.
  • Java ialah bahasa pengaturcaraan yang perlahan. Ia mempunyai kelas Integer Besar, tetapi ia tidak banyak membantu anda. Jika pertandingan mempunyai had masa, dengan Java anda pasti akan melebihinya. Java tidak diterima di semua pertandingan.

Mana boleh berlatih

Saya cadangkan Hakim Sfera Dalam Talian (SPOJ). Ia merupakan sumber yang berkesan dari segi kuantiti dan kualiti. Editor dan penyelesaian tersedia dalam talian jika anda terperangkap dalam proses menyelesaikan masalah. Sebagai tambahan kepada laman web ini saya cadangkan Kit Alat SPOJ и pengelas masalah untuk SPOJ.pl.

Pertama, anda perlu mengasah pengetahuan anda tentang asas

Sebaik sahaja anda membiasakan diri dengan sintaks bahasa, terdapat beberapa masalah untuk diatasi. Mulakan dengan masalah mudah yang memerlukan latihan. Pada peringkat ini, perkara utama ialah menentukan gaya pengaturcaraan anda. Mungkin anda suka menulis kod dengan banyak ruang kosong, mungkin anda tidak. Anda mungkin meletakkan kurungan pada baris yang sama dengan "jika", atau anda mungkin meletakkannya pada baris yang berasingan.

Anda perlu mencari gaya pengaturcaraan anda kerana ia adalah gaya ANDA.

Apabila anda mencarinya, ingat dua prinsip asas:

  • Kod anda sepatutnya mudah dilaksanakan. Anda sepatutnya berasa selesa melaksanakan penyelesaian yang anda buat. kenapa? Kerana semasa pertandingan, perkara terakhir yang anda mahukan ialah tersesat dalam kod anda. Adalah lebih baik untuk menghabiskan 5 minit tambahan memikirkan cara untuk memudahkan pelaksanaan kod daripada menghabiskan 10 minit untuk memikirkannya.
  • Kod anda sepatutnya mudah dibaca. Apabila kod mudah dibaca, ia mudah untuk nyahpepijat. Mari kita hadapinya—pepijat berlaku sepanjang masa. Anda tahu perasaan itu apabila anda mempunyai 10 minit lagi dan anda tidak dapat mencari kesilapan? Sudah tentu anda lakukan. Untuk mengelakkan situasi ini, tulis kod yang boleh dibaca. Sebaik sahaja anda mula menyahpepijatnya, kod tersebut akan kelihatan semula jadi dan mudah difahami.

Berikut adalah contoh saya gaya pengaturcaraan.

Cara Meningkatkan Kemahiran Pembangunan Anda

Berlatih, berlatih dan lebih banyak berlatih. Saya mengesyorkan agar anda menyelesaikan 250 masalah pertama yang paling boleh diselesaikan SPOJ. Selesaikan mereka mengikut urutan. Luangkan masa sekurang-kurangnya satu jam memikirkan penyelesaian kepada setiap daripada mereka.

Jangan katakan: "Masalah ini terlalu sukar untuk saya, saya akan cuba menyelesaikan yang seterusnya." Beginilah cara orang yang rugi berfikir.

Ambil sehelai kertas dan pensel. Cuba pertimbangkan. Mungkin anda boleh mencari penyelesaian, mungkin tidak. Sekurang-kurangnya, anda akan membangunkan pemikiran algoritma. Jika anda tidak dapat mencari penyelesaian dalam masa sejam, cari penyelesaian siap sedia di forum atau dalam artikel.

Apa yang akan anda capai dengan pendekatan ini? Belajar untuk melaksanakan idea anda dengan cepat menggunakan kod. Dan mengkaji masalah dan algoritma klasik.

Kedua, anda mesti menguasai algoritma dan struktur data

Ikuti pendekatan hierarki. Adakah anda mula berlari tanpa mengetahui cara berjalan? Tidak. Bolehkah anda membina bangunan pencakar langit tanpa asas yang kukuh? Tidak lagi.

Anda tidak boleh mengabaikan langkah sepanjang laluan pembelajaran. Jika anda mengabaikannya, anda akan ditinggalkan dengan jurang pengetahuan. Lama kelamaan mereka hanya akan menjadi lebih teruk.

Mulakan dengan algoritma asas dan struktur data

Sukar untuk bermula. Mungkin kerana anda tidak tahu apa yang perlu dipelajari dahulu. sebab tu Saya mencipta kursus video "Algoritma dan Struktur Data". Semasa membuat kursus ini, saya mengasaskannya pada cara saya ingin diajar. Reaksinya luar biasa! Lebih daripada 3000 pelajar dari lebih 100 negara telah mendaftar untuk kursus pada bulan pertama.

Jika anda berusaha untuk menyelesaikan masalah mudah, anda tidak akan bertambah baik.

Cara paling berkesan untuk memahami perkara yang anda tidak tahu ialah mengalaminya dalam amalan. Itulah cara saya belajar. Saya belajar banyak teknik baru yang tidak pernah saya dengar sebelum ini dengan memilih tugas yang mencabar.

Setiap masalah ketiga yang anda usahakan harus mengajar anda sesuatu yang baharu. Lebih berhati-hati apabila memilih masalah. Pilih masalah yang lebih sukar!

Sebaik sahaja anda menyelesaikan 250 masalah ini daripada SPOJ, anda akan mempunyai pemahaman asas tentang topik teras pengaturcaraan sukan. Dengan pemahaman yang mendalam tentang logik di sebalik algoritma asas, algoritma peringkat tinggi akan kelihatan kurang kompleks. Dengan cara ini anda boleh memanfaatkan sepenuhnya pengetahuan anda.

Gali lebih dalam setiap tema utama

Berikut adalah sumber yang berharga dengan banyak maklumat. Di sana anda akan menemui 10 algoritma dan struktur data teratas untuk setiap topik. Selepas 250 masalah dari SPOJ, anda akan tahu banyak dari senarai ini. Tetapi anda juga akan tersandung pada banyak perkara yang anda tidak pernah dengar sebelum ini. Oleh itu, mulakan mempelajari topik ini dalam susunan menaik.

Jika anda tidak mengukuhkan pengetahuan anda selepas mempelajari sesuatu yang baru, anda akan cepat lupa segala-galanya.
Saya mengesyorkan bahawa selepas anda mempelajari algoritma baharu, gunakannya dalam amalan. Kerjakan melalui 2-3 tugasan. Cari teg algoritma dalam SPOJ. Di sana anda akan menemui masalah yang memerlukan algoritma ini untuk diselesaikan. Atasi isu-isu ini terlebih dahulu.

Kuasai Pengaturcaraan Dinamik Kerana Ia Akan Membawa Anda kepada Kemenangan
Dari pengalaman saya, setiap pertandingan mempunyai sekurang-kurangnya satu masalah pengaturcaraan dinamik. Ramai orang sakit kepala apabila mendengar frasa "pengaturcaraan dinamik" kerana mereka tidak memahaminya langsung.

Dan ini bagus. Kerana jika anda memahami pengaturcaraan dinamik, maka anda akan menang.

Saya suka pengaturcaraan dinamik, ia adalah topik kegemaran saya. Rahsia pengaturcaraan dinamik adalah untuk membuat pilihan optimum secara global, bukan hanya pilihan tempatan. Anda mesti memecahkan masalah kepada sub-masalah yang lebih mudah. Selesaikan setiap submasalah ini sekali sahaja. Kemudian buat penyelesaian yang menggabungkan submasalah yang diselesaikan. Algoritma tamak - bertentangan dengan pengaturcaraan dinamik. Ia memerlukan membuat pilihan optimum tempatan pada setiap langkah. Dan pilihan optimum tempatan boleh membawa kepada penyelesaian global yang buruk.

Semasa mempelajari konsep baharu, lihat Tutorial TopCoder. Mereka sangat terperinci dan boleh difahami. Terima kasih kepada mereka saya dapat memahami pokok terindeks binari.

Berusaha keras

Pernahkah anda mendengar tentang atlet yang memenangi Sukan Olimpik tanpa latihan selama bertahun-tahun? Bukan saya.

Setiap tahun, persiapan untuk Olimpik Komputer bermula 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 algoritma. Saya masih ingat hari-hari ketika saya berlatih selama 8 dan bahkan 10 jam. kenapa? Kerana saya menyukainya. Setiap hari apabila saya pulang dari sekolah, saya terus ke bilik tidur, duduk di hadapan komputer dan mula menganalisis masalah baru. Atau saya sedang mempelajari algoritma baharu yang perlu saya ketahui untuk menyelesaikan masalah ini.

Jika anda mahu menang, anda perlu melakukan perkara yang sama. Pilih masalah dan berpegang padanya. Fikirkan semasa berjalan ke pasar raya atau semasa memandu.

Bagaimana saya memenangi 3 daripada 4 pingat emas di Olimpik Pengkomputeran

Adakah anda tahu bahawa apabila anda tidur, otak anda menyahpecah maklumat yang dikumpul pada hari itu? Dia kelihatan menyusun buku mengikut abjad di atas rak buku. Pada asasnya, otak anda berfikir tentang pelbagai masalah yang anda hadapi.

Ini boleh digunakan dengan mahir. Sebelum tidur, baca masalah yang sukar dan ingat apa yang diperlukan untuk menyelesaikannya. Pada peringkat ini, anda tidak perlu mencari penyelesaian itu sendiri. Pergi tidur. Otak anda akan mula memproses masalah ini. Apabila anda bangun, anda akan terkejut apabila menyedari bahawa anda telah menemui penyelesaian semasa anda sedang tidur.

Cubalah sendiri. Ia seperti sihir.

Saya membuat blog video

Bagaimana saya memenangi 3 daripada 4 pingat emas di Olimpik Pengkomputeran

Perenggan pendek ini tidak berkaitan dengan pengaturcaraan sukan. Jika anda berumur dua puluhan dan tertanya-tanya bagaimana saya melihat dunia, anda mungkin mahu menyemaknya blog video saya di Youtube. Saya bercakap tentang dunia, kehidupan dan sains komputer di dalamnya.

Kerja pandai

Inilah rahsia kejayaan. Anda memerlukan matlamat.

Kami adalah manusia dan kami menyukainya berlengah-lengah. Kami sentiasa mahu menangguhkan apa yang perlu dilakukan sekarang. Menonton Netflix sentiasa lebih menyeronokkan daripada menangani masalah pengaturcaraan dinamik. Anda tahu ini dan anda perlu membetulkannya.

Bagaimana untuk mengalahkan penangguhan

Tetapkan matlamat diri anda. Anda akan sentiasa menemui masalah menarik yang boleh anda pelajari sesuatu yang baharu (lihat sumber yang saya nyatakan di atas). Tetapi masalah ini perlu diselesaikan, bukan sekadar membaca.

Jadi inilah cara saya mengatasi penangguhan. Saya memulakan kalendar kertas dan mengisi setiap hari dengan masalah yang ingin saya selesaikan. Saya selalu mengisi masalah dua hari lebih awal. Jadi saya tahu bagaimana untuk menguruskan masa saya pada hari-hari berikutnya.

Bagaimana saya memenangi 3 daripada 4 pingat emas di Olimpik Pengkomputeran

Jadi saya sentiasa bermotivasi. Saya perlu menyelesaikan beberapa masalah dan mencari yang baharu untuk diisi pada hari-hari berikutnya pada kalendar. Menghapuskan masalah yang diselesaikan terasa hebat. Saya tahu awak juga sukakannya.

Dapatkan kalendar kertas anda sendiri. Jangan buat senarai tugasan lain pada telefon anda yang akan anda lupakan esok.

Bagaimana untuk nyahpepijat dengan berkesan

Adakah anda ingin menjadi seorang profesional? Jika ya, maka anda perlu "menyahpepijat dalam fikiran anda."
Ini adalah teknik penyahpepijatan yang paling berkesan yang saya tahu kerana ia tidak memerlukan penyahpepijat sama sekali. Otak anda meneliti berbilang cabang kod sekaligus dan memberi anda gambaran keseluruhan kod yang lebih luas berbanding dengan penyahpepijat klasik.

Anda boleh membandingkan diri anda dengan grandmaster yang bermain catur dan berfikir 3 langkah ke hadapan.

Saya menggunakan teknik ini semata-mata sebagai barisan pertahanan awal saya. Kemudian saya menggunakan penyahpepijat sebenar.

Untuk mengetahui cara menyahpepijat dalam kepala anda, anda perlu berlatih. Apabila anda mengesahkan penyelesaian kepada masalah dan mendapat "jawapan yang salah", jangan pergi terus ke butang penyahpepijat. Baca semula kod dan fikir: "Apa yang berlaku dalam baris ini?", "Bagaimanakah "jika" di sini mempengaruhi program?", "Apabila kita keluar dari gelung, apakah nilai lelaran?"

Dengan cara ini anda fikir sendiri. Lama kelamaan, anda akan belajar menulis kod dan nyahpepijatnya dengan cepat.

Mengenai pengarang

Bagaimana saya memenangi 3 daripada 4 pingat emas di Olimpik Pengkomputeran
Andrei Margeloiu ialah seorang pengaturcara yang gemar dengan minat dalam keusahawanan, pemula dan aktiviti luar. Anda boleh menghubunginya di LinkedIn.

Terjemahan: Diana Sheremyeva

Sumber: www.habr.com

Tambah komen