一些題外話
首先就是我為什麼要寫這麼一篇日誌。原因很簡單,就是因為前幾天有個想起步做acm人很誠懇的問我該如何入門。其實就現在而言,我並不是很想和人再去討論這樣的話題,特別是當我發現我有很多的東西要學的時候,我實在是不想花太多的時間在這種問題上。但是我當年也是純憑熱情搞acm過來的,實在是不忍心打擊乙個同樣有著滿腔熱情的起步者。所以乾脆就多花點時間,總結一下我的一些觀點和看法,以後再讓人問起這個問題的時候,也好不用再重複什麼了。
其次,我在這篇文章中並不打算**特別細節的問題,比如說如果某些人想從中得到諸如「該看哪本書入門比較好」或者「動態規劃、搜尋、圖論該怎麼學」之類問題的答案,恐怕要讓您失望了。我覺得書和方法都是因人而異,對自己最好的方法需要靠自己去摸索,抄別人是抄不來的。更何況當初我起步的時候也幾乎是乙個人單幹,沒什麼人推薦好書之類,都是搜到哪本書裡有我想看的東西然後就抓過來看,感覺不行就再換一本。很多眾口相傳的好書,我第一次看的時候,其實裡面絕大部分的內容我已經都學過了,所以這種書籍對初學者的作用,我本人並沒有切身的體會,而且也沒有過相關的教學經驗,所以不敢隨意評價。
最後,這可能是一篇非常低端的文章,希望大家不要抱著什麼很大的期望,免得到時失望更大。不足之處,還望諒解。
為什麼要做
acm?
這個題頭可能有些歧義。我這裡並不是想要宣傳acm有多好,而是我希望每乙個想參加acm的人先問一問自己這個問題:我為什麼要參加acm?我想從acm的鍛鍊中得到什麼?
在我看來,這個問題的最好的答案是「因為做acm很爽」。當你埋頭苦讀你千辛萬苦蒐集到的各種資料,終於學會了某演算法並用它a了一道連xx大牛都沒有做出來的題時,你覺得很爽;當你埋頭苦思數日,突然靈光一現想到解法,一下ac,多日積鬱一掃而空,你覺得很爽;當你看完一道題之後,行雲流水般的在鍵盤上敲著**,一遍通過sample並ac,你覺得很爽,就行了。
或許有人會問,搞acm能找到好工作嗎?是可以。但我覺得如果你真的想找到好工作,你應該多去外面實習,多做幾個專案積累經驗,而不是來搞什麼acm。搞acm能對學術有幫助麼?確實有。但是如果你真的想做學術,你應該早點進個實驗室,或者爭取去msra實習,或者自己多研究一些前沿的學術**,而不是來搞什麼acm。搞acm對保研加分有幫助麼?是有。但是你不覺得數學建模什麼的會比acm更有幫助麼?
當然我要承認的是,大多數acmer除了爽之外,確實收穫了很多其他的東西。可是如果你覺得除了「學演算法、coding、a題的感覺很爽」或者說「我想晉級final」之外,更期待某些其它的結果,那說明你真正應該搞的不是acm。如果有一天,你並沒有因為搞過acm而拿到乙份很優秀的offer,或者申請時發現你拿的那些acm獎完全沒有任何作用等等,你確信那時的自己仍然不會後悔參加acm,我認為這才是真正適合去做acm的心態。
找到「組織」
這裡的所謂「組織」,是指和你水平相近(最起碼討論的問題,層次不要差太多),並且願意經常和你交流的人,並不一定必須是乙個團體。「組織」是相當重要的,相互交流是快速進步的乙個重要因素,這個不僅限於初學者。當年我集訓隊在役的那段時光就是我進步最快的時候,因為我有兩個很強的隊友fishcanfly和mostleg,與他們兩個的交流讓我獲益良多,遠比之前乙個人單幹的提高要有效率。
就現在acm的發展狀況來看,想找到個組織應該不是很難的事情。能有在你身邊的人一起來做是最好的,像hit的「acm俱樂部」就是非常不錯的組織,很多學校的acm隊也應該會有類似在集訓隊之外的「編外組織」一類,應該多去打聽打聽。如果實在不行,網上有很多的bbs,qq群,甚至你在renren上多留意,都能找到很多的acmer,交流應該不會成為乙個主要的障礙。
如果實在是找不到組織,那就只能自己痛苦一點了,這點我也沒有什麼很好的辦法。不過這也並不代表就沒有希望了,我當年起步時hit的狀況也差不多,我認識的很多大牛也都是從這樣的環境起來的。樂觀的來講,這種艱苦的條件是很能磨練人的,出了什麼問題都必須靠自己。對有熱情有毅力的人來說,是乙個挖掘自己潛力的機會,並不見得是壞事。
要有毅力
這裡所說的毅力並不是指熬過肉體上的痛苦,比如說那個廣為流傳的「弱校acm奮鬥史」中寫的,在基地打地鋪,每天泡麵+熬夜一類。當然我對這種精神是相當欽佩的,只是這些困難其實不算是什麼大問題,因為只要精神不累的話,肉體上的疲累並不像想象中的那麼可怕。
我覺得acm很耗精力倒是真的。比如說你可能越學越發現要學的東西還有很多,似乎無窮無盡;或者你發現你周圍的人都進步神速,可是你自己卻還在龜速前進;又或者你在參加比賽時很多題都不會做,看完解題報告後發現竟然如此簡單,學會之後以為自己可以了,可是下次再比賽又有一大堆不會的題(我07年初做tc時就是如此)。大多數人總要遇到乙個長期不斷**的過程,很多時候精神上會很痛苦,會冒出到底還要不要繼續做下去,做這些都是為了什麼之類的問題。實際上我05, 06, 07這三年每年都遇到過這樣的問題,現在看來,我很慶幸我堅持下來了。
事實上,我相信凡是真正喜歡acm的人,是不會被這種困難擊敗的,只是應有一些心理準備,同時有一些決心才好。
不要迷信「神書」光環
其實這很簡單。很多神書確實神,可是不一定適合初學者。比如廣為流傳的,劉汝佳當年寫的那本黑書「演算法藝術與資訊學競賽」,也只是針對許久之前oi的那種「資訊流通性不強」的情況搞出的乙個大雜燴,我當年剛開始搞acm的時候就買了一本,結果擱了n年也沒看完。其實就今天的眼光來看,這書應該基本不符合時代了,要不然劉汝佳也不用大花心力再去編寫一套新的。還有眾口相傳的clrs,雖然我不是拿它來入門,但是我隱約覺得,如果有個明白人在你身邊指點的話,這書倒是還不錯;如果是初學者自學,不見得會有很好的效果。
至於到底該選擇哪些資料來入門?我只能說因人而異。記得當時我大部分知識的入門方法就是在網上尋找各種資料,其實我覺得網上有很多資料講得非常通俗易懂,對於乙個身旁無人指點的人來說,效果不見得會比那些神書要差。當然在這種「山寨式」的學過這些東西之後,還應該找幾本好書來仔細看一看,由於這時很多基礎問題不再是障礙,才能更加容易把握住這些好書中精華的部分。
多做難題
如果你去問那些牛人「這道題你是怎麼想到要用***方法的」,我估計大部分人都說不出個所以然來。其實很多情況下都是純憑直覺考慮到的數個思維方向,這種直覺是需要大量的練習來得到的,沒有那麼多「為什麼能想到」,類似於roba口中的「條件反射題」一樣。所以要多做題。
不過這裡的「多」不是指數量多,而是質量多。所謂的難題也並不是指要做那種難到天頂的題,而是適合自己的難題。如果一道題能夠讓你經過數個小時甚至一天的冥思苦想,最後終於ac,我認為這樣的題才是最好的。當然這是你要有一些相關基礎的前提下才能做的,不要一上來就走極端。
事實上,我認為只有對思維進行這種接近極限的運轉,才能最大限度的加深對相關知識的理解能力,在眾多的idea中一一排除,最後找到正確的那條路,也能讓你每個方法的本質有一些更深的理解。而且這種方法過題,得到的成就感顯然不是刷十幾個水題能比得了的。
至於這樣的題該如何去找,看某些有難度分級的題單是乙個不錯的方法,tc, cf這種題目分級相當明確的oj也是不錯的選擇,或者乾脆去看一道題的ac數和ac率。這個可能需要做很久才能把握住哪些題適合自己,但是當有了一些基礎之後,至少要時刻提醒自己,多做有質量的題,少做水題。
不要做太多比賽
因為絕大多數的比賽都不是面向初學者的,所以我覺得初學者做比賽有害無益。就算是做比賽,也應該明白做比賽的目的是要警告自己還相當弱,激勵以後繼續努力,而不是要檢驗這段時間的學習成果一類。
由於剛入門的人知識方面還有相當多的空白,想提高是一件非常容易的事情,有大量的資源可供使用,自己線下練習完全足夠,我看不出比賽會有什麼特殊的神奇效果。在我看來,比賽主要鍛鍊和提高的是自己知識和技巧的運用能力,或者你可以看成是「招式」。比如我07年做了一年的tc之後總結了一下,發現我的知識水平似乎沒有顯著的提高,倒是思維的活躍度、臨場發揮能力有了顯著的提公升,對實際上沒有超出自己知識水平的問題,ac率顯著上公升。但是想達到這個效果,首先要有足夠的根底,然後才是去考慮該如何高效的運用你的內功。只靠比賽是沒辦法無中生有的。而且比賽連續失利很容易打擊乙個人的熱情,這對初學者來說是很致命的。所以初學者對一般的比賽,建議還是少碰為妙。
如何學好VC
這個問題很多朋友都問過我,當然流汗是必須的,但同時如果按照某種思路進行有計畫的學習就會起到更好的效果。萬事開頭難,為了幫助朋友們更快的掌握vc開發,下面我將自己的一點體會講一下 1 需要有好的c c 基礎。正所謂 磨刀不誤砍柴工 最開始接觸vc時不要急於開始windows程式開發,而是應該進行一些字...
如何學好C
一些同學問我,如何學好c 我沒有別的辦法給你們,唯一的辦法就是讀書,讀大量的書,就可以解決。要把c 作為日常語言,而不是一種程式語言,這樣就好辦了。有人又要問我,那麼我應該讀什麼書才好?沒有時間怎麼辦?我只能對你們說,沒時間的話,就別學c 了,做你們喜歡做的事。生活中沒有c 也同樣美好。如果你準備學...
如何學好Visual C
如何學好 c 是每個學習 c 語言的讀者所關心的問題,筆者結合多年來的學習和工作經驗,總結出以下幾點學習的方法 q 對於初學者來說,基礎是最重要的,因此首先應找一本基礎的 visual c 圖書,認真閱讀,從中學習 c 語言的基礎知識,為以後更進一步學習打下良好基礎。q 在學習過程中,要多練習 勤思...