洛谷 P1309 瑞士輪(歸併)

2021-08-18 11:34:57 字數 1183 閱讀 4317

題意:一共2n個人(有乙個初始分數)進行k輪比賽,每輪比賽按當前得分排出名次,然後比賽按照第1名和第2名,第3和第4…第2n-12n進行(實力各不相同且實力大的總能獲勝)。獲勝方加一分,失敗方分數不變。

思路:

一開始想在每輪比賽前用sort排序,算了下複雜度大概o(n*(n*logn)+n*k),顯然不行。

後來想了下快排操作次數太多了,針對隨機數列還行,這種就有點浪費了,於是想到了用類似與歸併排序的思想,另外設定兩個陣列viclos存勝者和敗者,然後只需對vic[i],los[j]比較分數大小大的放進總數組裡就可以了

當然我使用結構體存資料。

**如下:

#include 

#include

#include

#include

#include

using

namespace

std;

struct competitorp[200003],vic[100002],los[100002];

int w[200001];//每個人的實力

bool cmp(competitor a,competitor b)

void merge(int e)

else

}while(i<=e)

while(j<=e)

}int main()

for(int i=1;i<=2*n;i++)

scanf("%d",&w[i]);//讀入

sort(p+1,p+1+2*n,cmp);

for(int i=1;i<=r;i++)

else

}merge(n);

}//for(int i=1;i<=2*n;i++)

printf("%d\n",p[q].num);//輸出排名為q選手的編號

return

0;}

總結:排序中的一些思想很重要。

洛谷 P1309 瑞士輪 歸併

每一輪快排,超時 include include include include using namespace std class athlete athlete int id,int competence,int score id id competence competence score s...

歸併 STL 洛谷 P1309 瑞士輪

樸素演算法每輪都sort會tle 所以要優化 用歸併 難點在於想明白為什麼是歸併 比賽過程中 輸贏持續有序 這是歸併的前提條件 所以才可以歸併 include include using namespace std const int maxn 2e5 10 struct team arr maxn...

洛谷P1309 瑞士輪

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