前段時間為自己隊伍總結了一下演算法方面的東西,最近又有學弟學妹問acm學習的東西,藉著選拔賽剛好結束,忽覺得為什麼要單單為我們隊總結演算法,而不是將整個acm的學習來個小結,於是,此文便誕生了。在談及正題之前,我也先說下,acm的學習人各有異,我的方法也不一定就適用於所有人,大家可以根據自己情況進行處理。另外,大家也可以去acmicpc.info那去找各種退役日誌,包含很多人的學習方法。
先說我最初學acm的水平吧,從大一開始正式接觸c++,就是不知演算法,不會**,乃至還略微想過要轉專業啥的人。所以,對於想學acm的人,與那時的我相比,只高不低,最少,在同一起跑線上。
首先,一般要學acm的人都是聽過acm的人,一般就是自己學校有這個東西的,那麼作為乙個準acmer,首要任務就是先要從人山人海中脫穎而出,成功加入acm隊才行。我的感覺,就以天大的acm選拔為例吧,首先,選拔賽的題目涉及高階演算法的並不會太多,畢竟選拔面向的一般是大一大二的學生,叫乙個不大會演算法或者只是略微學了點演算法的人去做演算法題,也體現不出什麼。就像這第二輪選拔賽一樣,這次演算法題出的不怎麼多,主要是模擬題數學題為主。於是乎,對於選拔賽,我的建議就是,乙個字,刷!刷他個兩三百道,然後再遇到選拔賽也就沒那麼容易被打倒了,當然,如果其他人也在刷,那也只能讓自己刷的更多才行了。
如果能在大一入隊最好,因為這樣你就有acm最為關鍵的乙個時間段,暑假集訓。之所以說它關鍵,也是因為它給acmer提公升的東西太多了,總結起來,我認為有兩點:1、來自高年級acmer的學習平台,包括可以方便提問題,以及ta們的授課等,這能夠讓初學者以較快的速度或者較短的時間突破自身不算太複雜的瓶頸。2、時間,個人認為暑假集訓之所以關鍵,大部分原因都要歸於這點,就以天大而言,暑假集訓從早上9點到晚上9點,中間吃飯花掉1個小時左右,一天有11個小時學習,你或許會問,怎麼可能集中的了精力學那麼久,實際上,當你看到周遭全是盯著電腦螢幕看題,噼噼啪啪鍵盤敲擊聲不絕於耳時,你就知道,你能夠堅持,這也就是人們常說的環境。然後,暑假放一周,一般會培訓7~9周時間,周天放半天,乙個暑假就算以7周計算也有差不多480+的集訓時間,如果你夠瘋狂,周天不給自己放加,晚上多訓一會,乙個暑假哪怕對於乙個初學者也是有逆天的可能的!
接著,我說說具體學習上的吧,這應該算是acm一直以來的難題,因為沒有人能夠說自己的方法就很好,就能成功,有的人就適合刷題提公升實力,有的人就適合做比賽,有的人就適合看**,還有人就適合玩ipad~。找到一條對自己能力提公升最快的路,或者幾條路,這對acmer而言不僅是乙個難題更是一種煎熬,尤其是在有大片可控時間時,或許,會發現怎麼都提公升不了水平,又或者提公升的微乎其微,一種有勁無處使的感覺。這,習慣上被稱為acmer的瓶頸,突破了它,實際上就是驗證了某條路對自己行得通,這是自己水平也就上去了。
之於我,破掉這層瓶頸的方法就是「acm刷題流」,正如「你若是天才,我便做瘋子」,你能看下題目就能ac的題,我就做它個十幾二十道,反正看書沒啥看的,**又找不到,比賽又**,著實無趣的很,索性乙個勁的刷題,看著自己排名蹭蹭蹭的上公升,管他實力具體究竟有沒有上公升,反正心是爽了一些,而且接著比賽的時候乍然發現,這題不是那啥的變體麼,這題不是那兩題的結合麼?這題雖然沒做過,但是感覺可以這樣做!於是,突然覺得做了那麼多題,雖然都是水題或者偶爾跳出道難題還是有用的,不知道怎麼提公升自己水平的,但的確它就做到了。
然後,當我刷夠**百題的時候,乙個個經典演算法,經典資料結構,經典男人八題就出現了,死磕磕不動,跳過心又有所不甘,對自己
實力有所質疑,對自己方法有所質疑。其實現在看來,大概是這種方法第一階段的能力提公升因子,已經被我大部分吸收掉,這或許也就成了第二個瓶頸。這時,我對acm也有了一些自我見解,敢有衝擊final的野心啥的了,也開始查漏補缺,也就是看一些不會的演算法,傳說中的演算法,一跳出來就能嚇死人的演算法了。接下來,讀一些**,認識到了一些牛人(額,我認識ta,ta不認識我那種),然後忽然發現以前一直在用的演算法,還有這麼奇葩的變體,還有這麼牛叉的轉化,思路又是大開,對以往認為的神題也有了進一步理解,可以根據題目講解啥的將它做掉了。這個階段,實際上是乙個比較讓人舒服的階段,因為不用去天天盯著排名看,與五虎上將較勁,不用數自己還差多少題就刷進poj前多少多少名啥的。而且,它還能讓人真的就解決某類問題,真的就感覺到自己水平的提公升,然而,儘管如此,還是不建議大家一上來就直接跳過第一階段來磕**,畢竟有時我們需要的是讀懂並能實現,而非單純了解思想,而沒有第一階段的積澱,也很難將乙個高階**的演算法實現的,當然,如果你屬於就適合讀**那種也例外。
ACM單調佇列學習小結
單調佇列 解釋為 佇列中元素之間的關係具有單調性,而且,隊首和隊尾都可以進行出隊操作,只有隊尾可以進行入隊操作。單調佇列的常用操作如下 1 插入 若新元素從隊尾插入後會破壞單調性,則刪除隊尾元素,直到插入後不再破壞單調性為止,再將其插入單調佇列。2 獲取最優 最大 最小 值 訪問首尾元素。一組數 1...
ACM 數論小結
斷斷續續的學習數論已經有一段時間了,學得也很雜,現在進行一些簡單的回顧和總結。學過的東西不能忘啊。1 本原勾股數 概念 乙個三元組 a,b,c 其中a,b,c沒有公因數而且滿足 a 2 b 2 c 2 首先,這種本原勾股數的個數是無限的,而且構造的條件滿足 a s t,b s 2 t 2 2,c s...
acm週末小結
這周老師稍微深入講了二分查詢演算法和三分法,二分查詢,就是從中間為界,向左或向右查詢,思想非常靈活,一些沒有思路的題目都可以用二分查詢做出來。簡單定義 在乙個單調有序的集合中查詢元素,每次將集合分為左右兩部分,判斷解在哪個部分中並調整集合上下界,重複直到找到目標元素。時間複雜度 o logn 優於直...