USACO 2.2 分析

 題目一:Preface Numbering

題目大意:求1——N之間的十進制數用羅馬數字表示時給個字母要用幾次(IVXLCDM)

算法:枚舉

基本思想是枚舉每一個數字分別轉換成羅馬形式統計再統計,但這種方法很多東西重複了,更簡單的方法是統計各個數字在各位上的出現情況,然後做一張表。因爲不同數字在不同位的情況很少只有9*Length種,具體實現的細節在代碼中有解釋

 

題目二:Subset Sums

題目大意:把1——N分成兩組,每組的和要相等,這樣的分法有多少種

算法:Dynamic Programming--揹包

容易想到和揹包有很多類似的地方,所以可以借鑑揹包的思想,s[i]表示當前無論以哪個數字結尾的和爲i的排列的種數,難點在於不重複。

但是也容易發現,只要把最後的N固定住就可以了;或者是最終的答案分爲兩類,以N結尾的剛好一半,以下是前一種解法

 

題目三:Runround Numbers

題目大意:給定一個數,找到最小大於此數的符合規則的數。

算法:枚舉

依次增大判斷的數,先去判斷數字有否重複,再去判斷是否符合規則,由於次數給定,所以能夠一次性確定下一個判斷的數位

 

題目四:Party Lamps

題目大意:開始時N盞燈都是亮着的,有四種操作可以轉變燈的亮暗情況,給定N,C(操作的總次數),以及最後某些燈的亮暗情況,求出所有符合的最終的燈的情況

算法:DFS

注意到一個操作兩次等於不操作,所以四種操作最終產生2^4 = 16種情況,至於操作次數,只要有用的不大於實際的,並且相差2的倍數就行,最後把得到的字符串排序

 

優化:還有一個很大的優化就是重複性,每6個一個重複,發現了這個,儘管大膽幹吧。

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