NOIP2011普及組的第三題:瑞士輪
第1次看到這題的時(shí)候斷言這題很水,后來(lái)發(fā)現(xiàn)安徽最高60分,有回頭仔細(xì)看看,發(fā)現(xiàn)的確非常難做。首先是排序中有三個(gè)量和兩個(gè)關(guān)鍵字,代碼不由得就復(fù)雜起來(lái),加上我用Anjuta還不是很熟,寫(xiě)得非常痛苦。
一開(kāi)使選擇對(duì)序號(hào)進(jìn)行排序,就是序列X【i】表示排名第i的選手的編號(hào),這樣的想法是好的,但寫(xiě)起來(lái)要非常細(xì)致,最后就變繁瑣了。
然后又選擇了對(duì)兩個(gè)關(guān)鍵字進(jìn)行依次比較排序,也是寫(xiě)得很煩,最后發(fā)現(xiàn)歸并排序其實(shí)是穩(wěn)定的排序,根本就不需考慮第二關(guān)鍵字......
這題的算法也比較難想,我想了大概有一個(gè)小時(shí)才想到滿分的算法(直接排序50%的就不說(shuō)了)
我一開(kāi)始想到對(duì)于每一輪比賽結(jié)束,每個(gè)人的分?jǐn)?shù)最多增加1,那么每一個(gè)人的名次上升的空間是有限度的,
我們可以考慮一種線性的維護(hù)方法,使整個(gè)序列仍然是有序的,但因?yàn)槭请p關(guān)鍵字,考慮起來(lái)實(shí)在比較復(fù)雜,就放棄了(這個(gè)要繼續(xù)思考!)
讓后就想到了歸并的思想,把兩個(gè)有序的序列合并。很顯然,對(duì)于在該輪中全部輸?shù)娜耍麄冎g的相對(duì)排名不會(huì)發(fā)生變化,
對(duì)于在該輪中全部贏的人,也有同樣的性質(zhì)。所以每次對(duì)于每輪比賽結(jié)束,只要用O(n)的時(shí)間就能讓整體變成有序的了。
注意:選手是有初始分?jǐn)?shù)的,第一輪要先排一次序。
注意:選手是有初始分?jǐn)?shù)的,第一輪要先排一次序。
posted on 2011-12-04 16:57 zyn.cpp 閱讀(2698) 評(píng)論(2) 編輯 收藏 引用