[技術] Code Jam資格賽心得分享

看板Soft_Job作者 (華麗的天下無雙)時間16年前 (2008/07/18 13:53), 編輯推噓16(16023)
留言39則, 9人參與, 最新討論串1/2 (看更多)
上個月報名的Google Code Jam,原本我以為第一輪的比賽是7月26才會進行的,想不到這 兩天上網才發現在台灣時間7月17日早上七點到7月18日早上七點有舉行一次資格考,必須 要在這24小時之內,完成三道題目,並且在時間內上傳到Google,當然,還包括原始碼, 每個題目都包括小輸入和大輸入兩個部份,完成小輸入可以獲得5 分,完成大輸入可以獲 得20分,要通過資格考的成績是25分。 小輸入可以上傳不限次數(不過失敗的紀錄會被記錄下來),在下載完小輸入之後,必須 在四分鐘內執行程式,獲得輸出之後把輸出的檔案和原始碼上傳,如果超過時間就算失敗 。每次的失敗,都會讓小輸入重新產生,所以每次所下載的小輸入都會不一樣,上傳的結 果會馬上知道。 而大輸入就不一樣了,大輸入的輸入值不但比小輸入既多且長。也許還會藏一些小輸入沒 有的陷阱也說不一定,而且大輸入上傳的結果不會馬上知道,而要等到比賽結束之後, Google才會去檢查大輸入的上傳是否正確,當然,他也會驗證你所上傳的程式碼是不是真 的能夠產生出這樣的輸出值。 裡面的題目其實都不太簡單,原來連資格考的題目都這麼靠北了,那第一輪的題目可不是 更難嗎? 而且我在完全沒有心理準備的狀況下,我本來想要用.net來作題目的,結果因為種種原因 ,我沒有辦法及時在我的電腦上安裝Visual Studio(最近才換成Ubuntu),只好改換 Eclipse來寫Java,但是想一想最後我還是用PHP來完成的,PHP這種鬆散結構的語法在 處理這種需要短時間完成的問題時非常有威力,非常快。 如果我要是用.net或是Java,恐怕花在定義類別和資料結構上所花的時間,就會耗掉我半 條命吧。 最後我只解出來兩題,但是大輸入的結果目前都是對的,理論上有50分,前面兩題都算 是我比較擅長的演算法題,一題考「可預知未來的最短路徑」(我是指它的精神,實際 的出題內容不是這樣子),另外一題則是兩點的排程問題,這兩題都我比較擅長的演算 法,但是第三題是幾何題,計算蒼蠅拍打中蒼蠅的機率,這對我來說實在是太難了,我 現在的幾核能力退化到我連圓面積的計算公式都要靠Google來幫我找。 看到榜上前幾名的一堆強者,半小時內就搞定了第一題和第二題,第三題雖然比較久,但 是還是在一個多小時之內疚可以完成,我實在太佩服了,我第一題花了3個小時,第二題 則花了4個小時,合計做完題目的時候已經花了10個小時了(我九點多才開始解) 由於第三題完全沒有頭緒,所以只好放棄了。原來寫程式也有在考幾何學的,偏篇幾何就 不是我擅長的項目。 不過看到這些高手,我覺得我的第一輪還是當作磨練好了。 談一下第一題的題目吧,我想大部分的人都應該解得出來第一題,我是用比較蠢的暴力 破解法,把每個搜尋引擎都丟進Query裡面試,哪一個能連續處理的Query最多,就用那 個當作是選擇的Search Engine,然後看能處理到第幾個才會遇到不能處理的Query, 就換其他的搜尋引擎重複這樣的過程一次,並把$n++,等全部的Query處理完,就知道 總共要切換幾次。 是計算兩個點兼第二題稍微難一點,是計算兩個車站間班次表,兩個站點必須在一天 內最少準備多少火車,才能滿足所有的班次發車都不延誤,火車到了以後必須等待 一個轉換時間(0-60分鐘,大樣本,0-5分鐘,小樣本)才能再發車,0表示馬上就 可以發車,一台車可以在兩地之間來回多次,這一點就使得在考慮的時候必須同時 考慮A地跟B地的狀況,我原本只是單純的比較depA(從A出發的時間) 跟ariA( 到達A地的時間,即B站班表中的到達時間),結果上傳了三次都是錯的,才知道這 一點會有很大的影響,於是只好改用模擬的方式,計算每個時間點各站的狀況。 我建立了一組資料結構: $schedule = array( $time => array( 0 => array( "TYPE" => ["DEP"|"ARI"], "PLACE" => ["A"|"B"]) ) ) 來紀錄每個時間點發生的事情,比如: $schedule = array( '07:10' => array( 0 => array( "TYPE" => "ARI", "PLACE" => "A"), 1 => array( "TYPE" => "DEP", "PLACE" => "A"), 2 => array( "TYPE" => "DEP", "PLACE" => "B") ) ) 就是說在07:10的時候有一台火車到達A地,有一台火車從B地出發,有 一台火車從A地出發。而ARI的順序一定在DEP之前,因為當T=0的時候, 火車可以到達後馬上出發,如果不先紀錄到達,就會發生錯誤。 接下來再用兩個資料結構: $trainAvail = array("A"=> string, "B"=> string)在A站或是B站可以 發車的火車時間,這是火車到達時間+T,當有火車到達的時候就寫進這個 資料結構,當有火車離開的時候先檢查這個資料結構理面試不是有小於發車 時間的火車,如果有,把這個資料元素從資料結構移除。如果沒有,則修改 另外一個資料結構: $trainCount = array("A"=> int, "B"=> int),把從A地或B地出發的火車 +1,表示站內沒有可以發車的火車,必須多準備一台火車。 把我有的時間點跑玩之後,$trainCount就是答案。 第三題的話就真的難倒我了,我知道方向,也知道是計算洞(蒼蠅可以閃過 拍子的面積/拍子的面積),但怎麼去計算邊緣的那些不完整的方形.... 完全不知道,就請高手解答囉。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.204.5.99

07/18 14:28, , 1F
不會啊 java 還蠻快的 XD
07/18 14:28, 1F

07/18 14:32, , 2F
第一題應該不少人被誤導去算每個搜尋引擎的出現次數吧 orz
07/18 14:32, 2F

07/18 14:32, , 3F
我覺得那是我會卡住的主因...greedy思路走錯方向 orz
07/18 14:32, 3F

07/18 14:37, , 4F
偷偷說, 這種考試以前大家都會針對題型準備template...
07/18 14:37, 4F

07/18 14:38, , 5F
臨場在重頭做幾乎都是砲灰..:p
07/18 14:38, 5F

07/18 15:05, , 6F
我也是這麼覺得 之前在玩入門acm級時就有感覺orz
07/18 15:05, 6F

07/18 17:07, , 7F
第一題greedy 從頭往下看下去 每當n種搜尋引擎都有出
07/18 17:07, 7F

07/18 17:08, , 8F
現的時候switch 最後那一個query算在做了switch之後
07/18 17:08, 8F

07/18 17:09, , 9F
跑到尾巴就做完了 第二題還是greedy 把到站時間加上
07/18 17:09, 9F

07/18 17:09, , 10F
turn around時間後當作新的"到站時間" 然後把所有進出站
07/18 17:09, 10F

07/18 17:10, , 11F
照時間排序 時間相同的 進站排在出站之前
07/18 17:10, 11F

07/18 17:11, , 12F
然後把sorted後的從頭到尾看一遍 A B各給一個有號整數
07/18 17:11, 12F

07/18 17:12, , 13F
flag,A出發:flagA++ B出發:flagB++ A出發到達B:flagB--
07/18 17:12, 13F

07/18 17:13, , 14F
有車到達A: flagA--, 紀錄flagA和flagB各自曾經到達的最
07/18 17:13, 14F

07/18 17:13, , 15F
高value 就結束
07/18 17:13, 15F

07/18 17:15, , 16F
前面這兩題是可以很快寫完 我用C寫 除了用string和vector
07/18 17:15, 16F

07/18 17:16, , 17F
和sort以外 沒用啥怪東西或是事先準備的code 感覺是不
07/18 17:16, 17F

07/18 17:16, , 18F
會太慢...
07/18 17:16, 18F

07/18 18:18, , 19F
呼呼.,..樓上應該沒看過比賽題目剛看完就有人解完的狀況..
07/18 18:18, 19F

07/18 18:19, , 20F
真的搶時間的時候可是分秒必爭:p
07/18 18:19, 20F

07/18 18:20, , 21F
功力強的應該各種case都背起來了..XD
07/18 18:20, 21F

07/18 18:33, , 22F
是ACM或IOI出身的嗎? :P 話說回來我印象中ACM也有看過
07/18 18:33, 22F

07/18 18:34, , 23F
比賽題目幾題當中有一題只有三隊做出來的情況 很久以前
07/18 18:34, 23F

07/18 18:35, , 24F
台灣區還是亞洲區的.....
07/18 18:35, 24F

07/18 18:35, , 25F
不過要針對比賽的話是你說的這樣沒錯啦
07/18 18:35, 25F

07/18 18:37, , 26F
我只是想表示 當做的順,沒走冤枉路的時候,很陽春的寫也不
07/18 18:37, 26F

07/18 18:37, , 27F
一定半個小時不夠啦 題目簡單的話
07/18 18:37, 27F

07/18 18:42, , 28F
細地...當年題目看完氣球就飄起來的時候只能說冏啊...
07/18 18:42, 28F

07/18 18:45, , 29F
這種比賽與其說是比演算法, 不如說是快速分析題目類型
07/18 18:45, 29F

07/18 18:46, , 30F
再套用已經知道的pattern下去解...:p
07/18 18:46, 30F

07/18 20:04, , 31F
前面兩題我想大家的解法都差不多
07/18 20:04, 31F

07/18 20:08, , 32F
哪邊有完整題目的咧~?
07/18 20:08, 32F

07/18 20:15, , 33F
07/18 20:15, 33F

07/18 21:31, , 34F
大家都好厲害,看來我這週末要惡補了,唉唉
07/18 21:31, 34F

07/18 21:39, , 35F
我覺得ACM ICPC的題目比較難耶 :Q
07/18 21:39, 35F

07/18 21:40, , 36F
太久沒做了,也許印象錯誤 @@
07/18 21:40, 36F

07/19 17:59, , 37F
樓上的大神怎麼跑出來的...
07/19 17:59, 37F

07/19 23:48, , 38F
看來平常偶而寫ACM真的會有幫助 :)
07/19 23:48, 38F

07/20 13:26, , 39F
ACM 比較難 +1
07/20 13:26, 39F
文章代碼(AID): #18W2_Ahh (Soft_Job)
文章代碼(AID): #18W2_Ahh (Soft_Job)