難,就代表了苦!
總結起來,有如下幾點:一、遠超於常人的時間付出;二、時間積累出的代碼能力;三、時間沉澱出的思維蛻變。這些讓我們在攻克ACM題時,更加注重方案的質量,不斷尋求最優解決方案,訓練出深度思考問題的能力。
比如說,授課老師很重視解題思維方面的講解,把一些基礎的數據結構、算法深入挖掘,以解決高難度的問題。
以前如此綜合的訓練做得很少,所以剛開始參加培訓時,我直到第三天才做對了一道題,之後的培訓算是有了眉目,每天早上去實驗室,聽老師講一上午課,下午晚上自己在網上做題,我大概每天可以對兩三道題,就這樣堅持到清明節前。做對題的過程給了我很多啟發,那樣一種思維訓練真考校人啊。
很少有人能真正掌握ACM競賽要求的絕大部分的計算方法,而對於一些包含了這些方法組合與循環的具有挑戰性的綜合問題,多數選手都無能為力。因為競賽中的很多試題都需要選手當場作出分析,而不是套用固定的解題格式,這是競賽的困難所在,也是它的魅力所在。可我沒能出校去參加大賽,失去了感受那種“魅力”摧殘的機會,比較遺憾終生。
第一次校賽定在3月22日,賽前有兩周特訓。那兩周我的狀態絕對比高考的時候還刻苦,比終南山修煉還用功,那幾天每天就是上課做題,不做題的時候就在腦子裡想題,別人說話都聽不進去,我真是非常投入。
特訓的兩周,我基本保持了這樣的作息時間:每天白天去聽課,基本都是看算法的書,或者睡覺,或者想題。從下午課上完時就開始在網上做題,每天熄燈前打開兩個題的頁面,然後熄燈開始編碼,隻編程我的筆記本電腦可以堅持到夜裡兩點,到電量耗完一般差不多能寫完兩個題,這兩個題就到第二天下午再驗證對不對,不對的下午就重新做。每天如此。
通過這段時間的訓練,大大提高了我的算法水平,也使我的編碼能力有了很大的提高,毫不客氣說在電院應該不輸給任何人,那時候欠缺的就是項目經驗。通過算法的訓練,我也學會了用google查問題。Google的出現,在當時還是很尖端的搜索工具,其強大的功能尚不被所有網絡使用者盡悉。學會、弄通使用google對我大三的學習和參加科研有很大幫忙,其實大學裡很多人根本就不會google的,實際他們遇到的學術問題,都無法直接在google上找到答案,這就需要搜索的技巧,而用英語版的google瀏覽器廣泛檢索外國文獻是我的獨門利器,誰叫導師早就讓我多掌握科技英語的。
ACM world final選手,不是一年時間每天就是在宿舍做題,參加各種比賽……參加競賽還需要掌握完全不是大學本科四年課本能教會的知識,如在顯微鏡下焊芯片,機械臂,實現NP問題的算法。Windows驅動開發……無論是興趣還是為了競賽而學習,需要花費自己無數的課余時間才能有這樣的成績。當其他人課余時間談戀愛,玩計算機的時候,你卻必須在實驗室學習。
這可讓小倩為難了,但她是堅決支持我的,如果我回家,她就給我做飯,而且包了洗我全部的衣服。
在這種高強度的訓練中,我和唐風等人的關系更鐵了,是的,沒有什麽比在一起拚過命的關系更深了。那時,我們四人都搬到寢室共同戰鬥,
把老江、小曾請走,把這個空間留給我們小組四人糟蹋,每天上網、查文獻、解題、討論、找方法折騰到下半夜,睡上四個多小時就起床。 因為我們需要的資料很難搞到,所以不得不自己找,讀英文的原著、原文,廣泛讀論文,看過幾十篇吧。我們曾仔細讀過一篇國內知名信號處理教授的文章,照著他的思路用程序實現,結果根本達不到他說的效果。我們不願浪費時間,便選用原始程序是國外的一個開放源的項目,跟著做給了我們很多啟發和收獲。國內外實力上的差別,又一次讓我向往出國見識見識。
在小組裡我的英語算最好的,這個光榮艱巨的任務就交給了我完成。讀英文文獻讀得要吐;我光讀還不行,還要給他們三人,甚至更多的同學講解,口舌費得我要冒火;有不懂的提問,我張嘴不是再細講,而是狠狠地指責兩字“傻啊!”講不通的就大家一起琢磨,琢磨到夜裡一、二點,推演的紙扔得屋裡滿地都是。
唐風、丁弘沙、任和旺三個學習機器,我弄的東西根本不夠他們填鴨的,而我是讀、講、解,花費他們的兩三倍精力,怎能供得上“機器”的吞吐呢?沒辦法,找來曾雍幫我們讀文獻,他的英語好、專業課也好,一心奔美國的主。讓他接觸ACM的文獻對他也有幫助,面子、裡子都照顧到,尖子小弟很給勁,也是深深地涉入進來,有了他的幫助我們學習進度才大大加速。
對於參加ACM的選手而言,代碼能力成為團隊能否生存中的基礎關卡。ACM比賽中答題時間非常寶貴,並且如果你提交的答案中出現錯誤,會有扣時的懲罰。雖然ACM競賽中每一道題目的代碼量並不大,但卻對準確性提出了十分高的要求。
準確性要求的直觀感受就是切題的手速要快、準、毒。為了能夠達成這個目標,必須有相對系統的數據結構、算法訓練,及更為變態的計算機體系架構等方向的訓練。有一次我遇到一道題目,想法思路都沒問題,但就是顯示錯誤。研究了好久,最後發現問題出在我定義的函數名稱和C語言中的一個庫函數重名導致的。見多了這些經常出現的bug,我們在思考解題方法、碼代碼的時候都會想得十分周全,注重代碼的邊界條件。
此外,定位問題的能力也是通過備賽訓練反覆打磨出來的。ACM選手在訓練刷題時通常會碰到一個程序跑在自己的小數據集上沒有問題,但是在ACM 在線答題平台上答題時,系統就會告訴你錯了,但它不會告訴你到底是哪裡有問題,這就需要答題者去想辦法定位問題了,並快速解決。
更大的改變體現在對選手結局問題思維的影響上。我覺得ACM更是一個鍛煉解決問題思路的比賽,這就像官方宣傳中說的一樣。通過最開始的訓練不斷積累起來的代碼感覺延續到實踐中就體現在了面對問題時的思考角度的變化上,能夠顯著提升在sense上,比如對時間複雜度和空間複雜度的考慮。其次,是養成了不斷追尋最優解決方案的習慣。當你面對一個問題,腦子裡同時會出現好幾種解決方案,這個時候我們就會不自覺地開始對比每個方案的優缺點,最後選出最適合當下場景的解決方案。
不積跬步無以至千裡,就是這樣一次次“耐操”的訓練,迅速鍛煉出了我們。這也是ACM的魅力所在,沒有最艱深,只有更艱深;沒有頂點,只有向更高點攀登。這是我們第一代ACMer的感悟,也是參賽的準則,可惜啊,我是個半路而止者。
到參加ACM比賽的時候,由於ACM競賽規定每支參賽隊伍由三名在校大學生組成,而我們這個小組有四人,必須退出一人。我認為丁和任是必須參加的,唐風與他倆配合默契,亦是理想隊員,便說自己退出吧,好無奈的選擇!
唐風建議我去找曾雍,在解ACM習題和掌握理解ACM競賽資料的過程中,唐風認為曾睿是個厲害的角色,我們兩個再找個散兵遊勇另組一隊,亦是有黑馬之力。但曾雍現在還不想那麽玩命參加ACM,我隻得放棄了,此外要參加大運會的足球比賽也是原因,所以臨到賽前就退出了,衷心地預祝唐風他們三人能搞出名堂。
現在想想,參加ACM競賽的高難度的訓練過程,主攻的就是ACM算法,可以接觸到各個方面各種不同的算法和其變形,涵蓋量很大;特別,參加ACM的訓練對代碼理解能力有很大的提升,可以及時發現問題所在,這給以後的軟件開發和調試階段的工作節省大量時間,也是自身能力的一種體現。
所以說,參加ACM的訓練確實對我有很好的鍛煉,特別是那種高度統合的思維和計算實踐,培養了我有效率地從事科研工作的習慣,乃至形成科學地從事其它工作的思維特征,就是一開始就往正確的思路上發展,盡量少走彎路達成目的。那些謀略性的思維訓練,以後在從軍指揮作戰時,仍會發生效力,能讓我及時發現敵人的圈套,或讓自己為敵人設下陷阱,機智破敵。
那些人類的思維和智慧的運用該是途殊歸同,按嶽飛元帥所說:運用之妙存乎一心吧。
探索ACM不是生活的全部,甚至連一小部分都算不上。一個人的生活應該是豐富的、充實的和多彩的。生活應當像浩瀚的宇宙,壯闊卻又靜謐,ACM不過是那絢爛星辰中的一顆。宇宙不因為少了一顆星而暗淡,但是卻可能因為多了一顆星而多了一段璀璨的文明。
謹借此地記述那一段自認的“波瀾壯闊”的日子!