第1次看到這題的時候斷言這題很水,后來發現安徽最高60分,有回頭仔細看看,發現的確非常難做。
首先是排序中有三個量和兩個關鍵字,代碼不由得就復雜起來,加上我用Anjuta還不是很熟,寫得非常痛苦。
一開使選擇對序號進行排序,就是序列X【i】表示排名第i的選手的編號,這樣的想法是好的,但寫起來要非常細致,最后就變繁瑣了。
然后又選擇了對兩個關鍵字進行依次比較排序,也是寫得很煩,最后發現歸并排序其實是穩定的排序,根本就不需考慮第二關鍵字......
這題的算法也比較難想,我想了大概有一個小時才想到滿分的算法(直接排序50%的就不說了)
我一開始想到對于每一輪比賽結束,每個人的分數最多增加1,那么每一個人的名次上升的空間是有限度的,
我們可以考慮一種線性的維護方法,使整個序列仍然是有序的,但因為是雙關鍵字,考慮起來實在比較復雜,就放棄了(這個要繼續思考!)
讓后就想到了歸并的思想,把兩個有序的序列合并。很顯然,對于在該輪中全部輸的人,他們之間的相對排名不會發生變化,
對于在該輪中全部贏的人,也有同樣的性質。所以每次對于每輪比賽結束,只要用O(n)的時間就能讓整體變成有序的了。
注意:選手是有初始分數的,第一輪要先排一次序。