1. 程式人生 > >一位acm過來人的經驗

一位acm過來人的經驗

很多ACMer入門的時候,都被告知:要多做題,做個500多道就變牛了。其實,這既不是充分條件、也不會是必要條件。

我覺得一般情況下,對於我們普通學校的大學生,各方面能力的差距不會太大,在這種情況下,訓練和學習的方法尤為重要。

其實,500題僅僅是一個標誌,而且僅僅表示你做ACM-ICPC有一定的時間,

我們訓練的目的是什麼?我覺得有四點
1、提高程式設計能力
2、學習演算法
,(讀書,讀論文,包括做一些題目驗證)
3、準備好面臨將到來的挑戰(熟悉題型,調整心態)
4、啟發思維。

這裡四個目的,從訓練的角度上,重要性逐次遞減;為什麼呢?
因為前面的因素是後面的基礎。而是後面的目的,想達成越為不易。我覺得前3者能保證你ac掉你能做的題,即使難題始終不會做,也可以ac掉中等偏難的題目。

而需要一定思維難度的題,要以前三者為基礎而且屬於訓練的後期,中期只能作為偶爾調節。當然,我思維也爛得要死,對這點沒什麼發言權,大家可以鄙視我。

我這裡想主要說下第2點。

對於演算法,我發現,很多我們這樣的弱校ACMer選手沒有側重好演算法的學習。
下面要講的幾點,可能都很老套,但我想以035對比我自己的例子給大家做說明。

<1>演算法學習是ACM比賽所要推廣或者要提倡的一個方面 
記得曾經路過某人的blog,上面說他作比賽的時候遇到了一個dijkstra,他沒做出來,然後評論到(大意):我才不會花時間去搞明白“這種”演算法。“這種”也許有可能是指:沒什麼實用性,對吧,這樣我就不想評論了(又是有關科學和工程的討論)。但起碼有一點需要明確的:ACM-ICPC比賽時關於電腦科學的比賽,電腦科學是演算法的科學,計算機演算法中dijkstra有著重要的實際和啟發意義,所以比賽一定要考。
你參加這個比賽,要拿獎,就必須學習這種演算法。你也許覺得你智商很高,但ACM-ICPC比賽本身不是智力比賽,比賽就是要讓你去學習這些東西,所以,如果你不想學的話,我覺得也沒有必要參加。說道這,可能偏題有點遠,但是希望以上的分析能得出這樣一個基礎結論:不想學好演算法,那沒有必要來比賽。

<2>用模板是不好的 
現在很多我們弱校的ACM-ICPC選手比較依賴模板,說實話,我也很依賴,但是我起碼知道一點,這樣是不對的,某種意義上說,這是你沒有把演算法學明白的一種表現。而且也嚴重影響編碼速度。在我見過的huicpc035參加過的比賽中,他從來沒有看過模板,全部現場敲,有一次比賽有個圖強連通分量+縮點+染色+什麼的題去了,我在他們機房做,我則抄模板,結果總共敲了1個半小時,而035明確演算法之後,啪啦啪啦,估計30多分鐘就敲完了。這裡順便八卦一下他:我和kevin以前去湖大集訓隊玩的時候,給他取了個外號——打字猛男(他應該還不知道)。因為他敲鍵盤的聲音特別大特別快,呵呵。

我覺得他敲程式碼的時間沒有浪費,某牛曾說:因為每次敲都有可能有不同的錯誤,所以不用模板是好習慣。我最開始學dancing link的的時候,自己敲出了程式碼,然後接下來的幾道題部分參考了以前的程式碼,後來基本上是直接copy。現在,當別人問我dancing link演算法或有關的題目的時候,我已經是一臉茫然。

所以,用模板是不好的,有時候由於某些原因可能你用了模板,但你起碼要知道這要做是不對的,並且有機會要改正。

<3>需要深入學習 
像ACRush、zzy、ahyangyi...等等國家隊的天才們,本身難以說我們與他們之間有什麼可比性。但是他們的學習方法應該還是值得借鑑的,他們的學習方法當然我們得不到言傳身教,但是從他們在國家隊集訓的論文中和他們搞完ACM-ICPC以後的軌跡中,可以有所體現。那就是:深入學習。

其實這點我來講可能還是不夠有力,因為我這方面也很欠缺,我儘量說下我的想法。

首先,覺得ACMer學演算法不應停留在看看程式碼實現這個層面,在演算法思想上要有清醒的認識,在正確性分析上要也應該要有較好的邏輯。因為網上的程式碼的實現上的一些細枝末節很可能掩蓋了演算法本身有的簡潔性、美感和思想。因而喪失了對演算法整體上的一些認識。還拿dijkstra演算法打比方,有些演算法不是基於dijskstra的直接建模,而是需要你修改這個演算法,這時你對演算法沒有真正理解的話,也就一籌莫展了。

我為什麼老說Dijkstra演算法,因為確實很多人都只知道用模板,而且模板還不好,在我看到的Dijkstra實現中,只有czyuan_acm的程式碼寫得好。不是說其他的不對,但確實是有問題,投機取巧了的。

所以,要閱讀論文和書籍,尤其與英文書籍,窺到它的本質。另一方面,只有這樣,你學的的東西才能在ACM-ICPC以外,給你一定的啟發——否則你會迅速忘掉它的。

據我所知,035起碼閱讀了幾十篇集訓隊論文,orzorzorz,而且切掉了例題。

<4>獨立思考 
這點我也很慚愧,因為我也是缺乏獨立思考的。很多題我不會了就去搜解題報告,所以反而我的搜資料能力變得特別強。035和許多大牛在這點上做的比我好多了,他們遇到題不會的時候,也不會很急於把題目做出來,可能每隔一段時間又拿出來想一次,總有一天想通了,之後這一型別的題目基本上也就沒有什麼問題了。

而我恰恰比較“虛榮”,做到的題目不會不太願意想太久,就想盡量快些AC,於是急於看解題報告,這樣導致的一個問題就是有些重要的東西解題報告中沒有提到,而我也沒去想就把他們忽略了,這樣,我還是不會做。我和035討論問題的時候,我不會一般就直接找他要程式碼,但是他不懂的時候,頂多問我大體的思路,而絕對不會要程式碼的。

在去年ACM賽區尾聲的時候,我發現035做中難題的能力已經明顯超過我一個檔次。看他現在做的題目,已然是相當變態,幾乎是都100以下人ac,這些題目我看了基本上沒什麼想法,更要命的時,解題報告也搜不到。035目前的狀態讓我想起一個人,不知道大家知道不:wangfangbob,他切bt題的能力也是令人汗顏的。

<5>做有意義的題 
1.是不要做水題,這裡的水題定義為:一眼就能看出做法,而且中途的實現可以預計沒有太多問題的題目。
2.是做能夠強化你最近學到的東西的題目
3.你不會但你應該會的題目。
這同時也是在說,某些沒太多代表性的題目可以少做,因為對比賽幫助不大。(當然我這個參加比賽的目的很功利,非功利主義者另當別論)剛才,我把我在poj上的號和他的號對比了下,他ac而我沒ac的基本上是難題,我ac他沒ac的一般是水題,看得我想哭,5555。

補充一點:ac的人多的並不一定代表著水題,有些幾千人ac的題目,在現場賽中ac的人很少,這樣的題目往往是有一定思維難度且編碼不難的好題,這種題目要認真做,某個學長說:經典的題目啊,只有那麼多,做一道,就少一道。

<6>估算好某種訓練所需要的時間 
我覺得我學網路流就是一個例子,我在大概賽區賽之前2個月開始學習網路流,1個月前開始學習費用流,但是對於我來講,這兩個月培養出來的網路流思維還是不夠(雖然也做了不少題),特別是,這種題目往往作為中難的題目出現,不會讓你隨便水的,於是,北京賽區的那道網路流當時就沒有想出來——功利地說,學習網路流沒有得到好的效果。

所以,現在來看,當時其實我可以不搞網路流。如果要學一種比較有難度的東西,並且還必須把他搞好,應該較早地,全面地學習,必須長期的訓練以培養這種思維。打個比方,如果你微積分平時不學,僅僅考試前一週狂做題目,我覺得上90分是很困難的。
當然,這要根據個人情況而定,我的理解能力應該說是中等水平,如果牛的話應該可以更快地學好。

<7>有關訓練的度 
我有時候通宵刷體,這裡我不知道huicpc035有沒有這個習慣,不過我通宵的時候沒見到他通宵。
我覺得其實通宵刷體,或者太長時間地做題,還是不好的。我們為什麼會這樣有熱情的做題呢,因為我們有興趣;但是一個人的成功不僅僅依賴於興趣,還要依賴於自控。這和打遊戲是一個道理,遊戲太有趣以至於我們常常通宵——ICPC題目也太有趣,所以有時候通宵。而且很多時候是,由於一道題AC不掉,所以賭氣一定要搞定才睡覺,這樣一不小心,就通宵了。
其實我明白,通宵不一定效果好,這僅僅說明了你興趣很高漲而已。通宵往往會打亂你的時間安排,打亂你的生物鐘,進而影響你短期或是中期的訓練計劃。而且,疲憊的狀態下做題,你往往只有ac題目的慾望,而完全喪失了ac題目的靈氣。所以,我建議,ACMer一定要合理安排作息,能夠自控,這樣不僅僅對你做ACM-ICPC有好處。
總之,有效訓練是很重要,只有通過有效的訓練你才能獲得你參加這個比賽應得的東西。

還有就是,除了035以外,另一個值得大家學習的就是richardxx——我也很佩服,我並不覺得他是天才,我覺得他以全方位的努力讓他自己變得優秀,大家看他的blog可以看到他的學習歷程。

最後要說下刻苦訓練這一點,這個我主要想說給我們學校的acm隊員:
客觀的說,我們學校很多名校落榜生(我相比而言是水進的)。確實都蠻聰明的,但再聰明也比不上ACRush吧?人家可是SGU都切滿了!ACM不是智力測試,不是你什麼都不做就可以天上掉餡餅的。當然我不是說題目一定要做多少多少道,但如果你覺得你可以一心二用,從概率上來講,你百分之九十地錯了,我是個工科生,我相信概率而非奇蹟。

我覺得035這方面也是值得我們學習的,我比較喜歡扯淡,有時候聊題目的時候也經常不小心就去扯其他話題去了,在學習的時候,035是堅決不多聊亂七八糟的東西的,除了討論上QQ,平時據我觀察都是殘酷地訓練。現在回想起來,我有點後悔,QQ上和網上花掉的時間用來學習新的東西,也許結果會更好。

ACM-ICPC絕不是大學生活的全部,也不是搞演算法的全部,你大可以花時間去做其他研究,做專案,或者參加學生工作(我更欣賞那些對人生和職業有良好規劃的ACMer);但是,如果你搞ICPC的那段時間你不是全部投入,那的在ACM-ICPC生涯中,將只有後悔。

相關推薦

acm過來人經驗

很多ACMer入門的時候,都被告知:要多做題,做個500多道就變牛了。其實,這既不是充分條件、也不會是必要條件。 我覺得一般情況下,對於我們普通學校的大學生,各方面能力的差距不會太大,在這種情況下,訓練和學習的方法尤為重要。 其實,500題僅僅是一個標誌,而且僅僅表

ACMer過來人的心得

<7>有關訓練的度 我有時候通宵刷體,這裡我不知道huicpc035有沒有這個習慣,不過我通宵的時候沒見到他通宵。 我覺得其實通宵刷體,或者太長時間地做題,還是不好的。我們為什麼會這樣有熱情的做題呢,因為我們有興趣;但是一個人的成功不僅僅依賴於興趣,還要依賴於自控。這和打遊戲是一個道理,遊戲太有趣

10年Java工作經驗的架構師聊Java和工作經驗

無需 動手 幫助 派生 ocp 從未有 dep sign 包括 從事近十年的 JavaEE 應用開發工作,現任阿裏巴巴公司系統架構師。對分布式服務架構與大數據技術有深入研究,具有豐富的 B/S 架構開發經驗與項目實戰經驗,擅長敏捷開發模式。國內開源軟件推動者之一,Smart

測試老鳥的工作經驗分享

  最近,部門剛畢業入職的小MM跟大家提議,讓大家把自己的軟體測試工作經驗分享一下,我整理了一下,可能不全。  測試工作經驗分享  一、測試階段劃分  1、 單個模組功能測試時間相對較長,但每一個專案都應該有專門的整合測試階段,並且應該不止進行一輪。  每一輪整合測試,應該都有自己的目的,比如第一輪整合測試,

★★如何從名程式設計師小白蛻變到今天,讓過來人告訴你,★★

嵌入式技術執行專用功能並被內部計算機控制的裝置或者系統。嵌入式系統不能使用通用型計算機,而且執行的是固化的軟體,用術語表示就是韌體(firmware),終端使用者很難或者不可能改變韌體。 ………………………………………………………………………………………………………… 嵌入式非常難,如何學習

測試大神的軟件測試工作經驗總結

優秀 效果好 專項測試 用例 軟件服務 修改 缺失 必修課 混亂 最近,部門剛畢業入職的小妹妹跟大家提議,讓大家把自己的軟件測試工作經驗分享一下,我整理了一下,可能不全。  測試工作經驗分享  一、測試階段劃分 1、 單個模塊功能測試時間相對較長,但每一個項目都應該有專門的

測試大神的軟體測試工作經驗總結

最近,部門剛畢業入職的×××跟大家提議,讓大家把自己的軟體測試工作經驗分享一下,我整理了一下,可能不全。  測試工作經驗分享  一、測試階段劃分 1、 單個模組功能測試時間相對較長,但每一個專案都應該有專門的整合測試階段,並且應該不止進行一輪。 每一輪整合測試,應該都有自己的目的,比如第一輪整合測

5年經驗年薪百萬,阿里P8分享自己的成長乾貨

  今天這篇文章,我前後讀了 3 遍,主人公是阿里最年輕的 P8 之一,工作五年連升三級,他在一次採訪中分享了自己的成長經歷和職場心得,非常接地氣,我們整理了 一下,真誠地推薦給每一個渴望成長和進步的職場人,希望能帶給你力量。 保持好奇心——培養主動學習的意識和習慣 我每

(轉)來自作業輔導老師的經驗分享

  https://baijiahao.baidu.com/s?id=1585466248617857440&wfr=spider&for=pc   最近看新聞,很多家長都會為孩子寫作業的事頭痛,作為一個曾經連續四年專職給孩子輔導作業,並讓全班90%同

經驗的清華應屆生要求月薪三萬以上,網友:他不值得這個價

眾所周知,清華大學是中國數一數二的高等學府,如果從清華大學畢業後,不怕找不到高薪的工作!有一位資深的公司HR面試了一位清華大學應屆生,這位清華大學應屆生面試公司的產品經理,因為是剛畢業,所以沒有什麼經驗!雖然這位清華大學應屆生沒有什麼經驗,但是他卻趾高氣昂要求月薪3萬以上,並

資深工程師FPGA設計經驗

從大學時代第一次接觸FPGA至今已有10多年的時間。至今依然記得當初第一次在EDA實驗平臺上完成數字秒錶,搶答器,密碼鎖等實驗時,那個興奮勁。當時由於沒有接觸到HDL硬體描述語言,設計都是在MAX+plus II原理圖環境下用74系列邏輯器件搭建

大資料開發工程師的兩年工作經驗總結

一位大資料開發工程師的兩年工作經驗總結 工程師人生 • 2018-07-02 16:41 • 9207次閱讀 今年廣州的六月,在經歷了大雨的洗禮之後,一切都變得更加明朗起來,新的工作,新的人和事。懶惰讓我變得更焦慮,焦慮促使我進步,程式設計師的焦慮大家應該都有共同的感覺,時代的步伐太快了

成功的經驗可以複製|普普通通的設計師將400變成了1億!

他從小喜歡畫畫,通過刻苦學習,考上了一所知名的美術學院的工業設計專業。 大家都知道學畫畫很辛苦,需要學很多東西,花很多錢,為了不辜負家裡的希望和自己的夢想,於是,他認真學習,講理論與實踐相結合,然後他經常在畫室畫畫,夜深人靜才離開是家常便飯。這也鍛鍊了他的膽量

5年運維經驗的工程師的自述

  杭州的2012顯得很陰冷。1號2號是我oncall,所以大門不出、二門不邁。一邊的筆記本幾乎是24小時開機,今天還算清淨,處理了一個工單後一直沒人打擾。昨天在微博上瘋了個訊息,大意是說時間過的太快,轉眼又是一年的最後一天了,得回首一下。一個同事回訊息說:習慣回首說明你

【轉】加班與加薪的祕密:華為工程師的經驗分享

1、薪水:薪水目前是統一應屆本科9K,研究生10K,博士12-14K左右;五險一金按工資標準交,年終獎分等級A/B+/B/C/D,每個等級內也有排名,A一般5-7個月,B+為3-5個月,B則是2-3個月,C的話有的部門有少許獎金,但大部分都是沒有獎金的,D屬於裁退績效。   年終獎一般是年中發4-5月份溝通,

有著20年經驗的企業家告訴創業者的5件事

今天,我和一位23歲有志創業的同伴一起喝咖啡聊天。他大學畢業後做了一年的投行工作。但他認為這份工作爛透了。他在整個工作中學到的最有價值的一件事就是他不想當一名投資銀行家。他把今後五年的創業目標告訴了我。 創業也是我心中的目標,我想和他分享一些建議,同時這也是我20年

大學生IT男談談剛大學畢業找實習單位的經驗總結

我是一名剛畢業的大學生,畢業於一所普通的二流大學,由於是師範類學校,所以自己學的計算機專業作為非師範類專業則顯得找工作相對來說比較難,我的要求不高,找一個我感興趣的方向(C++軟體開發)做一名程式設計師就可以了,由於剛畢業,所以對薪資方面也不敢有太多考慮。大致說說我個人的

IT 男的 多年工作經驗總結!!!

1、分享第一條經驗:“學歷代表過去、能力代表現在、學習力代表未來。”其實這是一個來自國外教育領域的一個研究結果。相信工作過幾年、十幾年的朋友對這個道理有些體會吧。但我相信這一點也很重要:“重要的道理明白太晚將抱憾終生!”所以放在每一條,讓剛剛畢業的朋友們早點看到哈!2、一定要

資深工程師FPGA設計經驗精華,吸收後你也能強大!

從大學時代第一次接觸FPGA至今已有10多年的時間。至今依然記得當初第一次在EDA實驗平臺上完成數字秒錶,搶答器,密碼鎖等實驗時,那個興奮勁。當時由於沒有接觸到HDL硬體描述語言,設計都是在MAX+plus II原理圖環境下用74系列邏輯器件搭建起來的。後來讀研究生,工作

跳槽必看!程式猿面試螞蟻金服後端的經驗總結!

前言   今天本是一個陽光明媚,鳥語花香的日子於是我決定在逛街中感受春日的陽光〜結果晚上七點的時候,螞蟻金服後端大佬來了電話,要進行一輪的技術面試。我一臉黑人問號???現在的面試都流行突襲嗎?  於是我的第一次面試之旅,就此壯烈的展開。 自我介紹