FOJ 2014.3 有獎月賽

                                                FOJ 2014.3 



由於跑A區去面試的原因,這次比賽沒參加,回來時已經四點多了,過了H題,然後D題交了一發,沒考慮一個盟國只有一個國家的情況,wa了一次,之後就結束比賽了…具體說下每道題吧。

 

A. 文件系統 

 

簡單模擬題。 把題目意思理清楚就比較簡單了。每個組給一個編號,並記錄它的成員,然後對每個文件進行判斷就可以了。(徐偉拿了一血!!)

 

B. A simple geometric problems 

 

題目意思是給n個點,求最多能選多少個點組成凸多邊形。這題一開始沒想到思路,後來在博兄的指點下才明白了……明白之後就覺得比較簡單了,果斷好久沒寫計算幾何了,反應比較遲鈍了。

首先對n個點組成的n*(n-1)條線段進行極角排序,從小到大。因爲我們逆時針來看,後一條線段的極角一定要大於前一條的。 然後枚舉第i個點爲起點時,遍歷排序好後的線段數組,不斷更新其他點的狀態,即到這點之前最多有多少個點。 時間複雜度 o(n^3)

 

C. YesOrNo 

 

首先得反應出來其實兩個等價的串,如果將它們看成一個環的話,它們是相等的。怎麼看出這點來呢,可以在紙上畫一畫找規律。其實如果我們將一個串的首尾連起來看,X操作其實只是將首尾位置變換到了X操作的點的位置,還是原來那個環,絲毫沒變。明白了這點後就好辦了。

先將兩個A串連接起來,只要B串是其子串即可。這裏採用KMP判斷。貌似題目數據弱了,直接暴力O(n^2) 判斷也是可以0ms AC的。

 

D. 盟國 

 

題目涉及兩個操作,一個是兩個國家結盟,另一個是某個國家退盟,很容易反應出是並查集。但是直接搞的話,退盟操作就有些麻煩了。

可以考慮給每個國家一個編號,退盟之後的國家再給一個新的編號,即放到末尾去,那它之前那個編號就不用管了,因爲它已經沒有任何影響了,這樣我們就對那些編號進行並查集就可以了。需要注意的一個地方就是:有可能一個盟國只有一個國家,這個時候退盟不會增加盟國數量,注意這點這題就沒問題了。

 

E. Climb Stairs 

 

 

簡單dp; dp[i]表示爬i層樓有dp[i]種方式;

dp[i] = dp[i-a] + dp[i-b];  dp[0] = 1;

所以答案就是 dp[a]*dp[b-a]*[n-b] (a<b) (注意要用64位整數)

 

F. ProgramCaicai's Trees 

 

樹形dp ,比較簡單

dp[i][0] 表示第i個點才用0方式時以它爲根的子樹的最小的代價

dp[i][1] 表示第i個點才用1方式時以它爲根的子樹的最小的代價

 

dp[i][0] = c[i][0] + Σ min(dp[j][0]+ C00 , dp[j][1]+ C01)

dp[i][1] = c[i][1] + Σ min(dp[j][0]+ C10 , dp[j][1]+ C11)

其中j 爲i的子節點

答案就是 min(dp[1][0],dp[1][1]);

 

G. 數字密碼 

 

這題比較蛋疼,一開始大意理解錯了,以爲是連續字串,直接就想到AC自動機DP了,代碼都敲完了,發現錯了,sad……

這裏是子序列,要注意。 一個直接的想法就是一個n維dp,匹配到每個串的第多少位時所需的最少的位數,然後轉移自然即使枚舉下一位取哪個字符串的下一位了。 不過n維dp直接搞在C++裏面應該不好弄。我想的辦法是將這個狀態Hash成一個整數,因爲最多7個串,所以可以將它採用7進制方式來hash,

然後就可以直接dp了。 實現的時候還是要小心點,能優化的地方有優化一下,不然會超時。

 

H. WuYou 

 

直接dfs就好了,參數記錄這一位是否是第一位,以及A 是否已經小於B 了;

 

當A 已經小於 B 了,那麼碰到問號,就直接取 9 就行了

如果還沒:

如果這一位不是問號,並且在這一位上已經大於B了,那麼直接返回

不然這一位就直接是A 在這一位的值了

 

如果是問號: 那麼想取與B相等的,然後考慮比B小1的情況

 

細節認真想想就OK了 !

 

第一次寫題解,寫得比較爛,如果大家要代碼可以QQ問我要,有更好的解法可以QQ跟我交流。

 

 

 

 

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