# 前言
## 學習目的
隨著信息技術的不斷發展,越來越多的同學開始學習程序設計和算法。他們學習算法的目的可能是為了參加NOI系列比賽、ICPC系列比賽,也有可能是為了求職、升學,甚至知識單純因為喜好,享受算法之美。
## 課程特點
**特點1**:覆蓋重要的初級知識點,打好堅實的基礎
本課程從介紹C++語言開始,各個擊破程序設計競賽中的基礎考點,包括各種基礎算法、數據結構和數學知識。這些都是重中之重,如果沒有掌握這些知識,繼續深入的學習就如同試圖建設空中樓閣。
**特點2**:深入淺出,解答“是什么、為什么、怎么辦”的問題
力求使用淺顯易懂的語言講述各種深刻的算法思想,而不是面對冰冷的數學符號和代碼。每個專題中都會以精心選擇的例題為主線,先介紹這個知識點是用來干什么的;然后通過大量的篇幅,圖文并茂地介紹各個知識點的詳細過程和代碼實現方法;最后結合題目,介紹了如何將算法應用到實戰中。有些例題甚至介紹了多種不同做法,幫助拓展思維,舉一反三。
**特點3**:充滿干貨的經驗之談
本課程的多數例題都配備代碼風格良好的示例代碼,可以幫助學員更好地學習算法如何使用代碼實現。在講解的過程中給出了大量的算法競賽中需要注意的瑣碎問題,這些都是前人的經驗之談,希望讓學員可以少走彎路。
**特點4**:講練結合,提供大量的練習機會
題目選材范圍多樣,覆蓋了應當學習了解的知識點。如果學員能夠完全掌握這些題目,相信可以有相當程度的進步。
## 內容安排
第一階段,介紹了C++語言的基本知識,包括表達式、變量、分支、循環、數組、函數、字符串、結構體等內容,后續所有內容都需要使用到這些語言基礎。同時輔以一些需要思考的入門算法題目,在學習語言的過程中初步接觸到算法的思維之美。
第二階段,介紹了一些基礎算法,包括模擬、高精度、排序、枚舉、遞推、遞歸、貪心、二分、搜索等。這些基礎算法是程序設計競賽中的重要部分。學習完這一部分可以解決一些簡單算法題目。
第三階段,介紹了幾種簡單常用的數據結構,包括線性表、二叉樹、并查集、哈希表和圖。數據結構是存儲和操作數據的骨架,許多算法的實現需要依賴各種數據結構。
第四階段,是在算法競賽中需要使用數學基礎,包括進制轉換、位運算、計數原理、排列組合、質數合數、約數倍數等概念。數學問題也是算法競賽的常考點,雖然相對比較抽象,但也應當掌握。
## 學習建議
如果希望從蒟蒻(巨弱的諧音,指新手)成長為神犇(非常厲害的選手),學習的過程絕不是輕松的。學習如同登山,唯有堅持不懈才能看到山頂美麗的風景。希望學員可以做到:
**熟悉固定套路與算法模板**:這些知識點學習起來很明確。學員應當理解每一種算法能干什么、適用于什么場合、算法復雜度是什么。除此之外還要反復的敲算法模板,從空白文件開始敲直到一遍通過為止,這一點你必須很熟練。
**分析方法與編程經驗**:如果希望能夠熟練掌握算法,增強思維敏捷性,在學習完算法與數據結構后,必須要大量的完成相關的題目。本課程普及組學完應完成至少300題的題量。只有自己親自動手實踐學到的東西才是自己的。
**保證程序正確**:培養一次寫對的能力,提交評測之前要謹慎。學會怎么調試自己的程序。就算感覺對拍辦不到(能寫出個暴力就不錯了),也應該人工生成多組數據,手算結果,然后測試自己的程序對不對。所有犯過的錯誤都要寫筆記,并且不再犯第二次。