2017華為程式設計大賽總結

2022-03-17 14:27:14 字數 2974 閱讀 5399

華為研發部門,每年都會在部門內部舉辦一屆程式設計大賽。旨在讓開發人員在工作之餘,通過遊戲程式設計的切磋,提高技術和協作能力。在入職華為的第四個年頭,我終於如願拿到了部門程式設計大賽的冠軍。之前的每一年也都會參加,其中兩次抱大腿拿到了亞軍,一次因為太忙棄權了。這一屆終於帶隊拿到了冠軍,了卻了一樁心事。在此,對之前的參賽經驗和感悟總結一下,做乙個紀念。至於下一屆?應該不會再參加了。

1、比賽報名階段

首先說說自己的感受,由於報名時是要確認隊友的。而這裡的隊友不要求技術多精湛,但是一定要有責任心,也就是把這個比賽當回事。你忙的時候,他能幫你分擔事情。你不忙的時候,大家可以一起討論比賽演算法和思路,互相勉勵。有時候即使忙到很晚,但是作為乙個團隊,大家都沒什麼怨言。所以個人認為挑選隊友是最最重要的事情。根據這幾年的比賽經驗來看,乙個隊伍要想拿到好成績,真的不是乙個高手帶著一堆醬油就可以完成的。

2、參賽事宜

一般組織者會把比賽隊伍的隊長拉到乙個群裡。群裡往往會第一時間發出框架bug,賽程變更,比賽規則安排等等事宜。所以在群裡的隊長一定要第一時間把群裡獲取到的訊息,通知給組內的成員。先不說隊友能做什麼,至少做起事情來可以胸中有成竹。很多人只管問下自己想要知道的事情,對於其他人交流的話題往往不太關心,這是個很大的失誤。。(防盜連線:本文首發自 )比如比賽開發進度有人快,有人慢,往往可以通過群裡的交流資訊得到一些思路或者是提前知道比賽bug資訊等。所以就算是在群裡打醬油的人,也請把醬油打滿。這或許就是所謂的情報工作吧。

3、**程式設計

其實**的演算法並不是需要使用多麼高效多麼複雜的演算法。但是一定要對整個的演算法過程,在心中有乙個思路。知道第一步做什麼,第二步算什麼,第三步解決什麼,後續還需要做什麼。比賽給的資訊有什麼,什麼東西我們不能直接拿到,需要自己進行資料的生成。(如比賽地圖的資訊)。很多人往往在這一步就畏難而止步,其實大可不必。只要你寫下第一行**,後續的**就可以漸漸的隱現出來,你需要做的就是一層層的拂去塵埃,看到潛意識中的演算法思路。

4、演算法思路的補齊

這個階段主要是核心演算法已經大概完成。但是細節處理起來往往不盡如人意。大部分時間,參賽選手的基本演算法其實都差不多,真正分出排名高低的原因就是這一步。而這一步又是最考驗人耐心的階段。需要隊員主要是反覆的測試model,也就是比賽官方提供的預設ai,不斷的進行比賽,翻出檢視錄影解決問題。如:

(1)為什麼會死,死之前有沒有出現重大失誤。如果有的話迅速找出問題原因並且修復。如果沒有重大失誤是不是最初的基本演算法思路就是有問題的。該怎麼避免這種問題。重寫還是優化。

(2)為什麼會死的這麼早,雖然說已經進入死胡同了,能不能用貪心思路多堅持一下,或許再堅持一下,往前邊走就是柳暗花明了呢?千萬不要這麼早就放棄。

(3)為什麼沒有死,但是卻輸了比賽。是不是對分數的獲取不夠敏感。如何調整權重,如何能使優勢最大化,甚至動態的調整策略權重。這些都對實戰有重大的影響。當時我們在小組賽的時候輸了一場。賽後反思原因,其中的乙個重要原因是在下半場分數領先的情況下(而且是必勝的情況下)沒有考慮上半場的分數落後了多少,從而出現了,明明可以贏,卻輸了的結果。

其它的思路還有很多,比如如何使**跑的更快一點,虛擬機器能否再優化下,記憶體會不會溢位,jvm會不會掛,如果丟擲異常怎麼辦,如果處理異常時又有異常怎麼辦。如果自己的「棋子」兩敗俱傷,如何止損,達到傷害最小化,利益最大化。如果必死,如何玉石俱焚,使對手的傷害最大化。(oh my god 越想越多,想想自己當初的思路也是夠瘋狂的)總之這一步是整個比賽階段拉開排名的重要環節。也就是查漏補缺階段。

5、關於參賽事宜

自己的感覺是隊伍內部最好有多次參加比賽經驗的隊友。往往某些忽略的比賽細節,以及賽前需要注意的事情,都可能最終會影響到比賽的走勢。還有程式設計大賽中可能會有一些灰度的事情,這些該如何應對。所以不要完全忽略掉**以外的事情。

6、比賽情況安排

在這屆比賽中,我被專案組安排為其他小組的比賽裁判。所以一邊在主持比賽,一邊還要觀察自己隊伍的比賽情況(時間、地點、賽況等)。這裡其實也是有重大失誤的。雖然我賽前已經安排了隊友去跟著**比賽,以免有任何環境指令碼等意外事故,但是比賽當時事情太多,完全無暇顧及。而我又是隊長,隊友完全不知道比賽的實際情況,導致很晚了,隊友才給我打**諮詢比賽情況。幸好當時我們隊伍所在組的裁判因為工作上的事情,開始比賽較晚,影響並不大,但是無論怎麼樣,這個錯誤很嚴重。關於這件事請看下文。

7、比賽臨場工作

我們隊伍所在的小組是h組,但是h組的環境有問題,應該是使用jre較老,導致虛擬機器始終拉不起我們編的jar包。當時我已經主持完其他小組的比賽,急匆匆的趕來。我一方面讓隊友排查指令碼問題,一方面跟h組的裁判解釋,因為根據比賽規程,如果比賽時初選類似問題,只可以修改啟動指令碼,不可以再修復**包括編包。最終在我們的要求下換了一台電腦,我們提交的jar包終於可以正常執行了。當時真的是十萬火急,如果不是對賽制的了解,再加上之前的比賽經驗,很可能直接就棄權了。因為當時的比賽已經只剩下和我們隊伍相關的比賽了。其他隊伍都在等比賽結果,而h組的裁判又在死命的催,這種時候來自外界的聲音往往比平常會更大。

8、注意心態

在小組迴圈賽中,我們隊伍的程式是最後執行起來的。而h組是公認的死亡之組,**其他隊伍的比賽,感覺他們的演算法很完善,而我們的程式卻死活不能啟動。在和隊友陸續嘗試各種方法未果,猜測可能是環境問題,要求換電腦,最終看到程式正常啟動時,真的是欲哭無淚。在和裁判的解釋過程中,雙發也發生了矛盾,我反覆解釋我們的要求是滿足賽制規則的。這一點賽後我覺得非常重要,正是因為站在滿足比賽規則的基礎上,你的所作所為才能被稱之為合理。。(防盜連線:本文首發自 )棄權和冠軍真的是一念之差,如果當時就放棄比賽了,覺得是生成的jar的問題,覺得是**的問題,如果當時沒派人跟隊冷靜的分析原因,可能結果完全不一樣。

另外乙個讓人啼笑皆非的事情是,程式正常啟動後,我們第一場比賽就輸了。就是我在前文演算法思路補齊階段所說的問題。當時沒有想到是分數計算的原因,只覺得自己的程式指令出現了「死迴圈」了。操作的「棋子」在繞乙個很大的圈,一圈圈的走。當時心想這還比個毛線啊。還好後續的比賽地圖不會再出現一些「特殊」的地形,導致我們的演算法在臨界點的判斷上可能互相影響,綜合起來造成一些很奇怪的現象。最終在16強中,我們隊伍與h組的第一再次相遇,憑藉對手演算法一次重大失誤(也有人說是演算法超時)最終贏得了比賽,劍指總冠軍。

比賽所能想到的事情就是這些了,謝謝你,2017;

謝謝你,我的隊友們;

也謝謝你,我的對手們。

華為程式設計大賽

本試題採用自動測試用例進行評分,測試用例不對考生公開,凡不滿足提交要求導致不能執行或用例不通過,不予評分 1 排序演算法 20分 l 問題描述 將給定的無序整數陣列降序排列後輸出,輸入的無序陣列長度為n,型別為unsigned int l 要求實現函式 void dscsort const int ...

華為程式設計大賽決賽題

題目 俄羅斯方塊覆蓋。給定 乙個21 21的格仔矩陣,從1到441編號。輸入是乙個檔案testin.txt,裡面有4個數字,每乙個數字代表陣列下標,陣列元素值為1,表示障礙。空著的格仔用0表示。這四個數字代表的圖形只能是這個中的一種!也就是說。矩陣中4個1勾勒出個圖形只能是這兩種樣子。要求是用俄羅斯...

程式設計大賽總結

經過5個小時的角逐,最終我已 a2題排在 22位結束了這次比賽,結果慘不忍睹。但是在痛苦背後的是其中的經驗,以及對我下定決心搞acm 以來這將近兩個月的時間的總結。總之,一句話,改變迫在眉睫。首先,先說我最痛苦的i 題,這題明明在我能力範圍以內,不是我做不出來的,做題過程中,嘗試個各種方法。但最後還...