20190818B組

20190818B組

T1:100(100)

賽時:

一看很像樹形,於是就碼了個樹形dp,可是莫名得打掛了。

看了看數據不大,於是想貪心。

將點的能量需求做一個排序,從小到大。

然後看這個點是否能根節點達到。

能就將路徑上邊傳遞的能量減掉。

賽後:

貪心,每次選取能量需求最小的節點,掃描它到根節點的路徑上的邊的容量,看能否滿足,如果能滿足就把它到根節點的路徑上的邊的容量都減去它的需求即可。

本題如果把握不好貪心的正確性也可以寫樹狀動規(多叉樹,揹包轉移),但是顯然編程複雜度就上升了一個層次。

算法:

貪心&樹形dp

T2:100(100)

賽時:

手玩了一下後發現,答案肯定在某個區間的右端點。

於是接下來就很簡單了。

直接從小到大排序,然後掃一遍就AC了。

賽後:

很容易想到,最優解的E肯定是某個區間的端點!

所以我們把所有區間的左右端點取出,從小到大排序,掃描一遍。

維護一個變量sa,表示掃描到的值爲p時,左端點大於p的所有區間的左端點之和;維護一個變量sp,表示掃描到的值爲p時,p在左右端點之間的區間個數。那麼此時可以封印一擊得到的能量就是sa+sp*p。

掃描時遇到一個左端點,sa減去這個左端點,sp加一;遇到一個右端點,sp減一即可。

算法:

模擬

T3:20(0)

賽時:

這題看完題目後,一臉懵逼。

根本沒有一點解題思路,但是題還是要做的在比賽裏。

於是我就開始想騙分。

亂打了一波後,時間也不多了,可有調不出來。

於是就輸出0加上去了。

賽後:

算法一:類比最長公共子序列的DP方法 (O(NM^2) 80分)

首先枚舉B的M個循環同構串。F[i,j]表示A串前i個字符和B串前j個字符能否匹配。

如果a[i]=b[j],F[i,j]=F[i-1,j-1];

如果a[i]='*',F[i,j]=F[i-1,j] or F[i,j-1] or F[i-1,j-1]。

邊界:F[0,0]=true,如果a[1]='*',F[1,0]=true,其餘爲false。

算法二:DP+RKhash (O(NM) 100分)

首先按'*'把A串分成幾段,從前往後第i段給一個hash值i,這樣的hash值最多有(N+1)/2個。

F[i,j]表示在B串的第i個位置之後,第一次出現hash值爲j的串的位置。

把B串前M-1個字符複製一份接在B串後面,枚舉起始位置1~M,然後利用F[i,j],依次向後找A串的那些段最早出現的位置,判斷最後到達的位置和起始位置的差是否超過了M即可。但是要注意如果A串開頭、結尾不是'*',要先把開頭結尾處理掉。

本題數據不好做,可能我做的比較弱(本來就只有兩個大點)。

 

算法:

dp+hash

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