2011 February Bronze

Final Results          

                 -- case number --
            1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
dance2      *  *  *  *  *  *  *  *  *  *
hexagon     *  x  *  x  x  *  x  *  *  x  x  x  x  x  x  x
treats      *  *  *  *  *  *  *  *  *  *


時間分配:
讀題花了大概半小時,第一題是括號匹配問題,第二題是模擬題,第三題是BFS。大概的思路有了,接下來開始編寫程序了。
這三道題中最難的應是第三題,於是決定先做第三題。

 

第三題:hexagon
難點1:怎麼去保存這張表
只能用數組保存了,就把圖中的格點都下沉,像個小房子的數組;

難點2:怎樣實現數字與圖中對應
用了預處理實現數組座標和數字之間的映射

難點3:怎樣找相連的邊
這個地方要考慮仔細一點,因爲邊界情況有點複雜。
最多也就六個相連的點,暴力一下,分別算出來;

難點4:怎樣處理左右相鄰不同的情況
具體聯繫題目中的圖,要分三種情況去想,做的時候本想偷懶,把中間的合併到兩邊去了,但是不對的,在補賽完後才發現了。

 

第二題:treats
難點1:讀題
題目的文字敘述比較多,所以要仔細不要漏掉細節;

難點2:怎樣去實現
如果每次找一個不被挑過的最大的,則時間代價太大,達到O(n^5);
可以另外給排序,從大到小依次取,但就涉及到保存表的問題,要能把信息還原回去,我是用空間換時間,開了1,000,000的兩個數組,映射回去值對應的座標;由於表是在進行着動態交換的,所以兩個大數組也要動態更新,還好更新不難;最後是怎麼交換的問題,由於行優先,所以要先去找可以往前移的行去交換,然後在去找可以往前移的列交換;基於每次肯定要靠前移,被佔用的行和列肯定是連續的,所以保存一個指針,指向當前可以交換的最小行列,就可以判斷交換是否可以進行,但是這個指針也是要動態更新的,有些點可以本身不需要交換,但是他們也會佔有相應的行列;


第一題:dance2
難點1:效率
如果真的老老實實去一對一對括號拆的話,編程複雜度較高,可能用指針實現會好些;但時間效率是比較低的;
由於題目沒有要求給出組合的方式,所以可以利用括號的一些性質,由於括號的形式是<>(題目中是><),所以在任何地方<的個數不會比>的個數少,否則只能往><的方向發展了;最後兩個方向個數要一致,就一定有一種方案可以配對了(證明??)

至於證明,可以用數學歸納法吧:
(1)當有n = 1對時,肯定是<>,存在配對方案;
(2)假設當n = k對時,存在配對方案;
當n = k+1是,易知第一個和最後一個一定是<,從左向右在位置i找到第一個>,則1 —— i-1都是<,把i-1和i配對,則剩下的一串仍此前所給符合要求,且有k對,由(2) 知,存在配對方案;
(4)綜上符合上述條件的必存在一種配對方案。

 

心得:
1.造數據尋找BUG是十分重要的;
2.在一段程序前加COMMENT會使程序思路會清晰很多;
3.慢慢適應用中間結果方式分塊檢查程序的正確性;
4.大數組放在主函數外,其餘儘量放在主函數內,循環變量在循環體內聲明;
5.自信點,不要以爲什麼都不會證明,第一題的證明還是在能力範圍內的,要去嘗試;
6.數據範圍還欠仔細,應該卡着估計,不應該放着估計,最後再適當加點;有的時候是數量級的估計錯誤;
7.if <> else <>嵌套小心忘記 else

 

 

My Code

hexagon.cpp

treats.cpp

 

dance2.cpp

  

 

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