我如何在計算機奧林匹克競賽中贏得 3 枚金牌中的 4 枚

我如何在計算機奧林匹克競賽中贏得 3 枚金牌中的 4 枚

我正在準備2017年Google HashCode世界錦標賽決賽。這是Google組織的最大規模的演算法問題競賽。

我從九年級開始從頭開始學習 C++。 我對程式設計、演算法或資料結構一無所知。 在某個時候,我寫了第一行程式碼。 七個月後,程式設計競賽迫在眉睫。 我想看看我的程式設計學習方式效果如何。 這是一個絕佳的機會。

經過兩天的比賽,結果出來了:我拿了金牌。

我很震驚。 我以 5 年的經驗領先競爭對手。 我知道我很努力,但這個成績超出了我的預期。 我意識到體育節目是我的主題,並一頭栽進去。

我知道是什麼讓我取得了成功,我想與大家分享。

我如何在計算機奧林匹克競賽中贏得 3 枚金牌中的 4 枚

本文的翻譯得到了 EDISON Software 的支持, 關心程式設計師的健康和早餐開發客製化軟體.

選擇哪種程式語言

  • C++ - 強烈推薦! 他速度非常快。 由於 STL,演算法的實作只需要很少的時間。 所有比賽均接受 C++。 我用 C++ 編寫了第一行程式碼。
  • C - 透過 STL 學習 C++。 如果您了解 C,您也可以使用 C++ 進行程式設計。
  • Java 是一種運作緩慢的程式語言。 它有一個 Big Integer 類,但對你沒有多大幫助。 如果比賽有時間限制,使用 Java 你一定會超過它。 並非所有比賽都接受 Java。

哪裡可以練習

我建議 球體線上裁判 (SPOJ)。 無論從數量還是質量上來說,它都是一種有效的資源。 如果您在解決問題的過程中遇到困難,可以在線上取得編輯器和解決方案。 除了這個網站我還推薦 SPOJ 工具包 и SPOJ.pl 的問題分類器.

首先,你需要磨練基礎知識

一旦您習慣了該語言的語法,就需要克服一些問題。 從需要練習的簡單問題開始。 在這個階段,最主要的是確定你的程式風格。 也許您喜歡編寫帶有大量空格的程式碼,也許您不喜歡。 您可以將括號與“if”放在同一行,也可以將它們放在不同的行。

你必須找到你的程式風格,因為這是你的風格。

當您尋找它時,請記住兩個基本原則:

  • 您的程式碼應該易於實現。 您應該能夠輕鬆地實施您提出的解決方案。 為什麼? 因為在比賽期間,您最不想看到的就是迷失在程式碼中。 多花 5 分鐘思考如何簡化程式碼的實作總是比花 10 分鐘試圖弄清楚要好。
  • 您的程式碼應該易於閱讀。 當程式碼易於閱讀時,調試也很容易。 讓我們面對現實吧——錯誤總是會發生。 你知道當你還剩 10 分鐘卻找不到該死的錯誤時的感覺嗎? 當然可以。 為了避免這種情況,請編寫清晰的程式碼。 一旦開始調試,程式碼就會顯得自然且易於理解。

這是我的一個例子 程式風格。

如何提升您的開發技能

練習,練習,再練習。 我建議您解決前 250 個最容易解決的問題 SPOJ。 按順序解決它們。 至少花一個小時思考每個問題的解決方案。

不要說:“這個問題對我來說太難了,我會盡力解決下一個問題。” 這就是失敗者的想法。

拿一張紙和一支鉛筆。 想一想。 也許你能找到解決方法,也許不能。 至少,您將培養演算法思維。 如果您無法在一小時內找到解決方案,請在論壇或文章中尋找現成的解決方案。

透過這種方法你會取得什麼成果? 學習使用程式碼快速實現您的想法。 並研究經典問題和演算法。

其次,你必須掌握演算法和資料結構

遵循分層方法。 您是否在不知道如何走路的情況下開始跑步? 不。 沒有堅固的地基,你能建造一座摩天大樓嗎? 不會再有。

您不能忽視學習路徑上的步驟。 如果你忽視它們,你就會留下知識空白。 隨著時間的推移,它們只會變得更糟。

從基本演算法和資料結構開始

很難開始。 也許是因為你不知道先學什麼。 這就是為什麼 我創建了一個視訊課程“演算法和資料結構”。 在創建這門課程時,我基於我想要的教學方式。 反應令人難以置信! 第一個月就有來自 3000 多個國家的 100 多名學生報名參加課程。

如果你致力於解決簡單的問題,你永遠不會進步。

了解未知事物最有效的方法就是在實踐中體驗它。 我就是這樣學習的。 透過選擇一項具有挑戰性的任務,我學到了許多以前從未聽說過的新技術。

你每解決三個問題就應該教你一些新東西。 選擇問題時要更加小心。 選擇更難的問題!

一旦您完成了 SPOJ 的這 250 個問題,您將對體育編程的核心主題有基本的了解。 深入理解基本演算法背後的邏輯,高階演算法就會顯得不那麼複雜。 這樣你就可以充分利用你的知識。

深入挖掘每個主題

這是一個寶貴的資源 有很多資訊。 在那裡您可以找到每個主題的前 10 名演算法和資料結構。 看完 SPOJ 的 250 個問題後,您將從這個清單中了解很多。 但你也會偶然發現許多你以前從未聽過的事情。 因此,開始按升序研究這些主題。

如果你在學習新事物後不加強知識,你很快就會忘記一切。
我建議你學習一種新演算法後,在實踐中使用它。 完成 2-3 個任務。 在 SPOJ 中尋找演算法標籤。 在那裡你會發現需要這個演算法來解決的問題。 首先解決這些問題。

了解動態規劃,因為它會帶您走向勝利
根據我的經驗,每場比賽都至少有一個問題 動態規劃。 很多人一聽到「動態規劃」這個詞就頭疼,因為根本不懂。

這很好。 因為如果你了解動態規劃,那麼你就會贏。

我喜歡動態規劃,這是我最喜歡的主題。 動態規劃的秘訣是做出全域最優選擇,而不僅僅是局部最優選擇。 您必須將問題分解為更簡單的子問題。 每個子問題僅解決一次。 然後建立一個結合已解決的子問題的解決方案。 貪心演算法 - 與動態規劃相反。 它需要在每一步中做出局部最優選擇。 局部最優選擇可能會導致糟糕的全域解決方案。

在學習新概念的同時,請查看 TopCoder 教學課程。 它們非常詳細且易於理解。 感謝他們我能夠理解 二元索引樹.

努力工作

你聽過沒有經過多年訓練就能贏得奧運冠軍的運動員嗎? 我沒有。

每年,電腦奧林匹克競賽的準備工作從九月開始,到四月結束。

這8個月我每天練習5小時。

是的,我花了這 5 個小時只解決演算法問題。 我記得那些日子我練習了8小時甚至10小時。 為什麼? 因為我喜歡它。 每天放學回家,我都會直奔臥室,坐在電腦前,開始分析新問題。 或者我正在學習一種新的演算法,我需要知道它來解決這個問題。

如果你想贏,你也必須這麼做。 選擇一個問題並堅持下去。 在步行去超市或開車時想一想。

我如何在計算機奧林匹克競賽中贏得 3 枚金牌中的 4 枚

您是否知道,當您睡覺時,您的大腦會對當天收集的資訊進行碎片整理? 他似乎正在按字母順序將書籍堆放在書架上。 本質上,你的大腦會思考你面臨的各種問題。

這個可以熟練運用。 睡覺前,閱讀一道難題並記住如何解決它。 在此階段,您不需要尋找解決方案本身。 睡覺。 你的大腦將開始處理這個問題。 當你醒來時,你會驚訝地發現你在睡夢中找到了解決方案。

自己嘗試一下。 這就像魔法一樣。

我創建了一個視頻博客

我如何在計算機奧林匹克競賽中贏得 3 枚金牌中的 4 枚

這段短文與體育節目無關。 如果你二十多歲,想知道我如何看待這個世界,你可能會想看看 我在 YouTube 上的視頻博客。 我在裡面講世界,講人生,講電腦科學。

聰明地工作

這就是成功的秘訣。 你需要目標。

我們是人,我們喜歡它 拖延。 我們總是想推遲現在需要做的事情。 看Netflix總是比處理動態規劃問題更有趣。 你知道這一點並且需要解決它。

如何戰勝拖延症

給自己設定目標。 你總是會發現有趣的問題,從中你可以學到新的東西(看看我上面提到的資源)。 但這些問題需要解決,而不僅僅是閱讀。

這就是我克服拖延症的方法。 我開始製作紙本日曆,每天都寫滿我想解決的問題。 我總是提前兩天填寫問題。 所以我知道如何管理接下來幾天的時間。

我如何在計算機奧林匹克競賽中贏得 3 枚金牌中的 4 枚

所以我總是充滿動力。 我需要解決一些問題並找到新的問題來填補日曆上接下來的日子。 劃掉已解決的問題感覺很棒。 我知道你也喜歡它。

取得您自己的紙本日曆。 不要在手機上建立另一個您明天就會忘記的待辦事項清單。

如何有效調試

你想成為專業人士嗎? 如果是的話,那麼你需要「在心裡調試一下」。
這是迄今為止我所知道的最有效的調試技術,因為它根本不需要調試器。 與其他程式碼相比,您的大腦會同時檢查多個程式碼分支,並為您提供更廣泛的程式碼概覽 經典除錯工具.

你可以把自己比喻成下棋的大師,他會提前思考 3 步。

我僅使用此技術作為我的初始防線。 然後我使用真正的調試器。

要學習如何在頭腦中進行調試,您需要練習。 當您驗證問題的解決方案並獲得“錯誤答案”時,請勿直接轉到偵錯器按鈕。 重新閱讀程式碼並思考:“這一行發生了什麼?”、“這裡的“if”對程式有何影響?”、“當我們退出循環時,迭代器的值是多少?”

這樣你就可以自己思考了。 隨著時間的推移,您將學習編寫程式碼並即時偵錯。

關於作者

我如何在計算機奧林匹克競賽中贏得 3 枚金牌中的 4 枚
Andrei Margeloiu 是一位狂熱的程式設計師,對創業、新創公司和戶外活動感興趣。 你可以聯絡他 在領英上.

翻譯:戴安娜·謝列米耶娃

來源: www.habr.com

添加評論