TCO13 Round 1A 題解

昨晚沒起來……於是今天早上做了一下……


250pts:給定一個N*M的地圖,每塊有一個高度(0~9),現在要調整一些塊的高度,使得整塊地圖中最高的塊的高度與最低的塊相差不超過1。將一塊身高或降低一個單位的代價爲1,求最小操作代價。

分析:高度只有0~9,直接枚舉判斷就好了……


500pts:一隻青蛙要從數軸上的0跳到D,數軸上有N個不重疊的區間內部是不能進入的(端點可以),求一個最小的X,使得青蛙每次向前跳X個單位可以跳到≥D的位置,而且中途不會跳入任意區域。注意X可以是一個實數。D≤30000,N≤50。

分析:首先X肯定≥最長的區間長度。由於X要最小,那麼一定會存在一個時刻青蛙跳到了某個區間的右端點。於是我們枚舉這個區間,然後枚舉到這個區間跳了幾步,得到一個X。由於最長的區間長度≥1,所以步數不會超過D。然後我們對每個區間判斷當前枚舉的X是否合法,如果合法就更新答案。注意這題可能會存在精度問題……因爲這個FST的可能有不少吧……


1000pts:給定一個N*M的地圖,每塊有一個上下左右的箭頭,表示到了這一塊要走到箭頭所指的下一個格子。地圖的上邊界和下邊界、左邊界和右邊界是聯通的,即從左邊出地圖會到達右邊,etc。如果從一個地圖的任意一個格子出發,沿着箭頭走可以回到出發的格子,那麼稱地圖合法。求要修改至少幾個格子的箭頭才能使得地圖合法。

分析:如果把地圖的每一塊抽象成節點,每個點向箭頭指向的點連邊,那麼合法的地圖應該對應一個每個連通塊都是強連通分量的圖。由於每個點只發出一條邊,所以事實上每個連通塊也都是一個環。也就是說,每個點應該發出一條邊,同時連入一條邊。

假設只要判斷一個地圖是否合法。我們可以建立一個網絡流模型。把每個點拆成兩個,一個代表出,一個代表入。從源向每個點的出節點連一條容量爲1的邊,從每個點的入節點向匯連一條容量爲1的邊,每個點的出節點向箭頭所指的節點的入節點連一條容量爲1的邊。如果滿流則合法。

現在考慮改方向。我們把網絡流模型改成費用流模型。原網絡流模型的所有邊的費用都爲0。每個點的出節點向非箭頭所指的三個方向的節點的入節點連一條容量爲1費用爲1的邊。答案即最小費用最大流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章