洛谷 p1309 瑞士輪

2022-06-26 12:45:10 字數 1110 閱讀 5565

題意:有很多選手,選手一開始有編號,初始積分和能力值,編號按輸入順序決定,輸入完成後按積分排名,積分相同編號小的在前

規定比r輪比賽,每輪比賽第一名與倒數第一比,第二名與倒數第二比,依次類推。能力值大的贏,贏的加一分,輸的不加,每次比完一輪都要動態重新整理排名。

一開始,每次比完一輪我都會重新排個序,後面超時了,後面看到個更好的解法

因為每次比完,所有的贏家之間的排名和所有的輸家之間的排名是不會變的(因為如果乙個贏家,它上一輪是輸家,那麼它即使這一輪贏了也不會比上一輪就是贏家且排他前面的贏家分數高,其它上一輪是輸家這一輪是贏家的人也和它一樣都只加了一分,相對位置不會改變,同理輸家們也是一樣)所以可以每次比拼結束後贏家加入贏家組,輸家加入輸家組,這樣這兩個組中已經組內有序了,接下來再歸併這兩個組就能得出排名,這樣每次重新整理排名所要的時間複雜度只有logn

ps.當時不知道優先佇列,現在發現估計可以用優先佇列做,每次比拼一次更新完分數後再入佇列

#includeusing

namespace

std;

typedef

struct

papa;

pa a[

200500

];bool

cmp(pa a, pa b)

intmain()

for(int i=0; i)

cin >>a[i].ability;

sort(a, a+n, cmp);

vector

winners;

vector

losers;

while(r--)

else

}merge(winners.begin(), winners.end(), losers.begin(), losers.end(), a, cmp);

} cout

<< a[q-1].num+1

<

return0;

}

洛谷P1309 瑞士輪

本題同樣是noip普及組第三題。因為太久沒有做過題目了,先從普及組開始練習吧。題目內容 很顯然想到的思路就是模擬,如下 include include include include using namespace std struct player bool cmp player a,player...

洛谷p1309 瑞士輪

因為太菜不會寫p1310 表示式的值,就只能過來水兩篇部落格啦qwq 另外這個題我是開o2才過的 雖然是寫了歸併排序 可能我太菜寫的歸併不是還可以 剪枝 吧qwq 哎,果真還是太菜啦qwq 所以準備寫歸併然後去題解學習正確的不用開o2就可以過的演算法 瑞士輪 題目鏈結 其實這個題打眼一看可以直接so...

洛谷 P1309 瑞士輪

在雙人對決的競技性比賽,如桌球 羽毛球 西洋棋中,最常見的賽制是淘汰賽和迴圈賽。前者的特點是比賽場數少,每場都緊張刺激,但偶然性較高。後者的特點是較為公平,偶然性較低,但比賽過程往往十分冗長。本題中介紹的瑞士輪賽制,因最早使用於1895年在瑞士舉辦的西洋棋比賽而得名。它可以看作是淘汰賽與迴圈賽的折中...