Problem
給 N 個點,用圍籬將這 N 個點包裹起來,並且每一個點距離圍籬距離至少為 M。
求圍籬總長最少為何。
Sample Input
|
|
Sample Output
|
|
Solution
可以將點拆分成好幾個元件,分開進行圍籬。利用高速求出子集的方式,窮舉所有的拆分方式。
dp[s]
表示點 s 所需要的最少圍籬長度,dp[s] = min(dp[u] + cost(s-u))
。
圍籬長度為凸包總長加上一個圓的周長 (多邊形外角總和為 360 度)。
|
|
給 N 個點,用圍籬將這 N 個點包裹起來,並且每一個點距離圍籬距離至少為 M。
求圍籬總長最少為何。
|
|
|
|
可以將點拆分成好幾個元件,分開進行圍籬。利用高速求出子集的方式,窮舉所有的拆分方式。
dp[s]
表示點 s 所需要的最少圍籬長度,dp[s] = min(dp[u] + cost(s-u))
。
圍籬長度為凸包總長加上一個圓的周長 (多邊形外角總和為 360 度)。
|
|
給一個電路圖,有四種閘 AND, OR, XOR, NOT,接著給定閘的輸入端、輸出端,以及預期的輸入和輸出。
請問是否存在電路故障。若只有一個電路故障,輸出故障的情況,否則輸出無法判斷。
故障情況有反向、全為 1、全為 0。
|
|
|
|
如何橋接電路會比較難寫,這裡用 OO 的方式去撰寫,為了方便起見,設計輸入端口只會在 div ~ 512
,剩餘在 0 ~ div
。
接著窮舉損壞情況,對於每次窮舉,跑一次電路架構。
|
|
駕駛蒸氣機在道路上,啟動蒸汽機通過道路需要時間。當要進行轉彎時,必須在轉彎口前進行煞車、出了轉彎口後開始加速,煞車和加速會造成所需時間變成兩倍,在起點出發必須加速、抵達終點時必須減速。
請問最少花費時間需要多少。
|
|
|
|
定義狀態 dist[i][j][dir][k]
在轉彎口 (i, j),前一次進入轉彎口的方向為 dir,在此之前是否有煞車 k。
隨後進行最短路徑。
|
|
給定 N 個單字,請問在長度為 M 的密碼中,密碼符合出現這 N 個單詞的情況有多少種。
在密碼個數少於 42 種時,將所有密碼輸出。
|
|
|
|
建立 AC 自動機,使用 AC 自動機上的 dp,對於每一個 node 將單字用 2^N
來表示 dp 狀態,因此每一個 node 的狀態為 dp[len][1<<N]
表示匹配長度 len,並且已經 match 到的狀態。
由於要輸出 42 以內的密碼可能,在輸出答案前,進行回溯標記,確保下一步可以抵達到可行解,接著進行 dfs 搜索。
|
|
特別小心測資存在兩個單詞相同、一個單詞是另一個單詞的 substring。
|
|
旋轉盤面,讓每顆球落入屬於自己的洞,請問至少需要幾次旋轉。
|
|
|
|
首先有可能落錯空洞,模擬時必須特別小心這種非法的旋轉。在一次操作中,有可能在落入空洞的瞬間,下一個球剛好可以通過這個填滿的洞。
將每個球的座標壓成狀態,進行 Bfs 搜索。
|
|
販售冰淇淋。
已知每一種口味的冰淇淋、不同種的冰淇淋脆皮的庫存量,也已知冰淇淋口味與脆皮之間搭配獲得的利益。
求出在兜售完畢的情況下,最大獲益、最小獲益分別為何。
|
|
|
|
保證在兜售完畢的情況下,相當於 maxflow 流滿,那麼可以套用最少費用流來找到最少利益。為了解決最大獲益,取個補數來套用最少費用流模型。
|
|
給定多組組合票價的方案,以及目標的通行順序,請問最少花費需要多少。
組合票必須按照順序使用,當沒有使用完時,選擇將組合票拋棄。組合票之間,不會發生交替使用剩餘的部分,意即手上只能持有一張組合票,之前用到一半的組合票都必須拋棄。
目標的行程順序,走訪時中間可能會多繞路,但必須依序走訪目的地。
|
|
|
|
建圖方面相當麻煩,特別小心,有可能會在行程外的地點換組合票使用。
每個點的狀態為 (i, j)
,表示完成行程中第 i 個目的地,當前位置在地圖編號 j。因此針對每一個組合票,嘗試建造從行程中的第 i 個目的地,到下一個目的地。
隨後求最短路徑。
|
|
給定 N 盞燈,第一盞燈的所在高度 A。
Hi = (Hi-1 + Hi+1)/2 - 1
在 Hi 不低於地面高度 0 的條件下,請問最後一盞燈的高度最低為何。
|
|
|
|
二分搜尋第二盞燈的高度,推算出所有燈的高度,必且找最小高度。
|
|
詢問區間最大值、最小值、標準差
A[l, r] = val
。A[l, r] += val
。
|
|
|
|
利用線段樹的懶操作,解決區間修改問題。
特別注意到區間的 assign
優先權高於 add
,當懶操作 assign
被指派時,取消 add
。將懶操作標記在節點 x 上,其 x 已經統計好結果,若發生要走訪 x 的子樹,將標記傳遞給子樹。
標準差的部分,可以利用 平方和 和 總和 計算之,因此紀錄總共需要四項 sum, sqr, mx, mn
來完成此題。
|
|
每個炸彈都有引爆範圍、炸彈半徑、以及炸彈所在座標。
1 : 1
。求平均花費 (引爆總花費 / 引爆次數
) 最小為何?
|
|
|
|
問平均最少花費是有原因的,如果只問最少花費只需要引爆無法被連鎖的炸彈,或者在 SCC 連通元件中找一個花費最小的炸彈。
首先,在一個連鎖反應下,先做 SCC 進行縮點,知道一個 SCC 元件中用花費最小的那個炸彈代表即可,將圖轉換成 DAG 後。indegree = 0
的點必然需要手動引爆,在這樣的情況下,已經能讓所有炸彈引爆。
為了要讓平均花費最小,勢必增加引爆炸彈的數量,引爆時便能降低平均花費,但引爆的順序必須按照拓樸排序,否則會違反 引爆過的炸彈,無法再次引爆 的規則。
藉此,根據貪心策略,將非 indegree = 0
的炸彈拿出,按照花費由小到大排序,從花費小的炸彈開始嘗試,直到平均花費無法變得更小。
選定哪個炸彈需要引爆後,仍要按照拓樸排序的方式輸出。
|
|