Problem
兩名玩家進行放邊的操作,當其中一名玩家成功創建一個三角形,則可以再放入一邊,直到該操作無法創建一個新的三角形,則進行輪替。最大化自己與對方的分數差異。
一開始先模擬兩名玩家的操作過程。
Sample Input
|
|
Sample Output
|
|
Solution
這題很妙,總之先定義狀態 dp(盤面狀況,剩餘三角形) = 最大化差異
。
那麼轉移方程要看操作是否造成輪替,如果仍然為自己,則把下一步的最大化結果累加上來,反之扣除。
|
|
兩名玩家進行放邊的操作,當其中一名玩家成功創建一個三角形,則可以再放入一邊,直到該操作無法創建一個新的三角形,則進行輪替。最大化自己與對方的分數差異。
一開始先模擬兩名玩家的操作過程。
|
|
|
|
這題很妙,總之先定義狀態 dp(盤面狀況,剩餘三角形) = 最大化差異
。
那麼轉移方程要看操作是否造成輪替,如果仍然為自己,則把下一步的最大化結果累加上來,反之扣除。
|
|
參照《算法競賽入門經典》一書
一種磁碟儲存的機制,磁碟除了資料儲存,同時也會賦予檢查碼,來修正錯誤的資訊,即便能力相當有限,最多修正一個錯誤位元。
現在要求的工作是進行錯誤位元的復原,並且輸出 16 進制下的資料,如果資料不足 4 bits,則剩餘位元接補上 0。
|
|
|
|
這題很簡單,但是一直沒注意到陣列開太小而炸掉,我的預設記憶體不夠大而 WA。剩下的細節則注意錯誤位元如果是檢查碼就可以無視,而同時檢查碼只支持修正一個位元,如果需要修正兩個以上則表示無法復原。
|
|
參照《算法競賽入門經典》一書
軟體安裝時,會同時下載所需要的插件包,而插件包的軟體也有可能繼續安裝所需要的插件包。如此遞迴下去把所需要的元件都安裝好。
當安裝一個軟體時,分成使用者安裝和系統安裝兩種,使用者只能刪除自己安裝的軟體,其相依的插件包必須由系統來進行刪除,系統刪除時,會檢查是否還有其他軟體需要相依,若不存在相依,則會將此軟體刪除。
|
|
|
|
一道模擬,假想一張 DAG 圖,刪除時暴力檢查其逆向的依存軟體是否存在。
使用 STL 和遞迴可以讓程式更簡單易懂。
|
|
參照《算法競賽入門經典》一書
模擬醫院的手術室和恢復室(病房),每個病人分配到一個手術室後,手術完成後會被送至恢復室,而送病人於手術室到恢復室都需要 t1 時間,而每個病人在手術室和恢復室的時間也各有不同。
當手術室和恢復室被使用完畢後,分別需要 t2, t3 的時間進行清除整潔工作,隨後才能再給下一位病人使用,保證每一位病人在過程中都能立即使用不會延誤。
編號小的病患,會先選擇可使用的場地,場地編號也會盡可能地小。
|
|
|
|
建議使用一種時間軸的概念,維護一個 priority_queue 來知道下一個事件發生時間,接著在那時間掃描可能發生事件,這樣維護會比較容易寫。
出題者到處打雜呢!
|
|
模擬 CPU 排程,並且每種指令的所需時間都不同。一個程式可以使用 quantum 的時間,最多負一次執行某個指令 (quantum > 0 變成 quantum <= 0 的情況)。而當 unlock 只將一個程式從 block queue 吐出,而非所有程序。
保證每一個程序都會有一對 lock/unlock。
|
|
|
|
作業系統排程 lock & unlock 模擬,去年某一天心血來潮寫,卻狂 WA。現在回過頭才發現對 quantum 的使用錯誤,在有限時間內,即使在有剩餘時間下,執行下一條單位操作,直到沒有剩餘時間,我卻用加法限制於 quantum 下,導致炸掉。
題目中 “When an unlock is executed, any program at the head of the blocked queue is moved to the head of the ready queue”,為什麼只有一個 blocked queue 元素彈出,雖然在效率考量上是這樣,誤看成全部彈出,怪不得會一直 WA。但這樣所有模擬都會完結?
|
|
起床才發現,Facebook Hacker Cup Round 2 比賽不是比 24 小時,翻譯機的小夥伴醒了嗎?在這樣的情況下,只好自主宣告放棄,看題一直失敗,整個心情都壞了。關於 Round 2,根本沒看懂題目,就這麼結束了。
[2015 Facebook Hacker Cup Round 1]
*Homework (10 points)
數學老師給一份質數作業,要求找到 [A, B] 之間的正整數,有多少不同質因數個數恰好等於 K 個,例如 12 = 2^2 * 3
,則 f(12) = 2。寫一個程式來快速完成它。
A, B 小於等於 1000 萬,而詢問組數不超過 100 組,預估就算 O(n) 窮舉,速度來說仍然可以在時間內完成。無聊可以使用線性篩法,快速得到某個數字 x 必含的其中一個質因數來加速,f(x) = f(y) + 1, x = y * z, z power of prime nubmer。而區間查找可以針對 K 分開成數組,進行二分搜索。這樣寫太拚,有六分鐘的時間,暴力一點也無仿。
*Autocomplete (25 points)
手機輸入單詞,會自動補上正在輸入單字的後綴,現在要求依序輸入單字,至少要敲入幾個字母,才能將所有單字完成。這題有點奇怪,照理來說要給定一個字典,接著開始鍵入,但這題是根據之前輸入的單詞,如果前綴相同就不能自動完成,怎麼補完的一點都不科學。
這題用內建 set<string>
,可以使用 iterator it = map.lower_bound(word), it--;
來找到最有可能的前綴單詞,一定得輸入最大共同前綴長 +1,如果不想用內建,可以帶入 Trie 來完成,保證單詞總長不超過 100 萬,在某些題目 Trie 的速度跟泛用性相當高。
*Winning at Sports (25 points)
在比賽中,勝利情況分成有、無壓力兩種方案,無壓力的情況是過程中,最後獲勝者的分數恆大於另一方,有壓力的情況是過程中,在另一方達到終盤分數前,最後獲勝者的分數不得大於另一方。現在給定終盤分數,請問兩種方案的比賽過程分別有多少種。
Dynamic programming 狀態 dp[a][b]
表示分別得分 a, b 的方法數,每次轉移 dp[a+1][b] += dp[a][b], dp[a][b+1] += dp[a][b]
特別小心條件範圍,分別對兩種方案做一次迭代。
*Corporate Gifting (40 points)
每名員工都有一位上司,保證是樹狀結構,每名員工將要買禮物送給上司,禮物的花費為 $1, $2, …, $n,每個人都不想送出 $x 後,又從下屬中得到 $x 的禮物,請問該公司買禮物的總花費最小值為何?
樹狀最小帶權著色問題,套入樹形 Dp 的思路,定義狀態 dp[u][2]
表示以節點 u 當作 subtree root 的最佳解,其中 u 買 $?1, $?2 的兩種花費最小方案。合併時,窮舉 root 購入的價格,結合子樹的最小花費,防止同色即可。根據官方題解,使用的是 dp[u][log n]
,可想而知數學推導得到最大購入不超過 $(log n),但實際運作,我並沒有這麼做,而是看子樹最大著色數為何,再根據最大著色數進行窮舉。
這一題看到 N=200000
就要有點警惕,一般電腦預設 stack 大小,遞迴深度最多撐到 10 萬,呈現鏈狀很容易造成 stackoverflow,其一解決方案是編譯器調參數,其二 bfs 後的拓墣排序。
[2015 Facebook Hacker Cup 資格賽]贖罪篇
windows 參賽,卡了一個 \r\n
問題,剛好有裝 git,使用以下指令做轉換
|
|
會計師要騙過稽查人員,可以把金融數值任意交換兩個位置上的數字,請問能交換得到的最大、最小值分別為何?並且數字不可起首為 0。
喵蛋,最簡單的這題 recover step 因 continue 指令而被忽略,窮舉兩個位置做交換,大部分可以看到寫法有 string compare, int compare,最方便是在字串下處理,接著看要轉數字或者直接用字典順序比較都行。
|
|
新年新希望,目標均衡飲食,要求蛋白質、澱粉、脂肪攝取剛好的量,挑選 n 個食物,只有不選、或者是只能一樣走。求是否能辦到?
在 n 不大的時候,套用 bitmask 窮舉最為方便。用 Dfs 搜索當然喜聞樂見,如果 n 很大,而要求的量很小,則可以使用三維 dp[P][C][F] 狀態來解決。如果要求倍數關係,而數量無限的話,可以轉換成幾何分析。
|
|
給予 2D 地圖,裡面的雷射裝置將會感應使用者的腳步,每踏一步則順時針換方向,並且發射出雷射,雷射只會因牆壁、雷射塔而被屏蔽,但是雷射跟雷射之間不會相消、折射。現在雷射裝置的起始方向各有不同,避開雷射,找最少步數抵達終點。(只能走上下左右四個方向,停留不能解決問題,雷射裝置因感測而行動。)
基礎的 Bfs,因為只有四個方向,根據時間做紀錄,每四次操作進行一個循環,則 int dist[time4][pos_x][pos_y],考慮在哪一個 time mod 4 抵達某個位置。接下來麻煩的是檢查操作,檢查操作有兩種,其一,預處理每個時間下雷射發射,其二,從當前位置反搜索雷射光是否對著自己。
|
|
半徑為 R 的圓上有 N 個點,請問任挑三點形成的三角形面積總和為多少。
|
|
|
|
因此總共有 C(N, 3) 的三角形,聽說直接窮舉三點計算三角形面積就可以過,時間複雜度是 O(n^3)。事實上可以換個方式想,計算三角形面積,相當於用一個圓減去三個弓形面積。
那麼實際上會有 C(N, 3) 個圓減去一堆弓形面積。關於所有弓形面積的計算,可以窮舉兩點拉一條邊作為弦,接著會有兩個弓形,分別找到左右兩側的點數,就能知道有多少三角形分別使用多少次這些弓形面積,加總之後就是總共的弓形面積,複雜度降至 O(n^2)。
事實上還可以再更數學點,但是不太會推導,最後貌似可以在 O(n) 完成。
|
|
每一個飛機的安全範圍視為在三維空間平行三軸的六面體,給定 n 台飛機的安全範圍,請問重疊至少兩次的空間體積為何?
|
|
|
|
離散化 X Y Z 軸出現的座標值,壓縮成 n * n * n
的三維陣列,接著將每一台飛機的安全範圍離散化後,將其所在的位置進行標記。
離散化後,每一格將會具有不同的長度,把離散的數據聚集在一起,而事實上在工程數學中,離散化一詞則是將連續的數據變成整數離散的情況。
|
|
給一個平面圖的樹,請問是否同構,每一個節點相鄰的邊將會按照逆時針的順序給定。
|
|
|
|
這一題與 UVa 12489 - Combating cancer 有點不同,這一題限制在平面圖,因此邊的紀錄是有順序性的。而題目不僅要求結構相同,同時在節點上面的 label 也要相同。
但是只要固定一個當作根,成為一個有根樹,那麼在最小表示法中,除了根的分支可以旋轉外,其餘的節點的分支都不能旋轉。因此固定其中一棵樹的根節點,接著窮舉另外一棵樹哪個節點作為根節點,分別找到最小表示法進行比對即可。
|
|