【題目描述】
2×n名編號為1-2n的選手共進行r輪比賽。每輪比賽開始前,以及所有比賽結束後,都會按照總分從高到低對選手進行一次排名。選手的總分為第一輪開始前的初始分數加上已參加過的所有比賽的得分和。總分相同的,約定編號較小的選手排名靠前。每輪比賽的對陣安排與該輪比賽開始前的排名有關:第1名和第2名、第3名和第4名、……、第2k-1名和第2k名、…… 、第2n-1名和第2n名,各進行一場比賽。每場比賽勝者得1分,負者得0分。也就是說除了首輪以外,其它輪比賽的安排均不能事先確定,而是要取決於選手在之前比賽中的表現。現給定每個選手的初始分數及其實力值,試計算在r輪比賽過後,排名第q的選手編號是多少。我們假設選手的實力值兩兩不同,且每場比賽中實力值較高的總能獲勝。
【輸入格式】
第一行是三個正整數n,r,q,每兩個數之間用乙個空格隔開,表示有2×n名選手、r輪比賽,以及我們關心的名次q。
第二行是2×n個非負整數s1, s2, …, s2n,每兩個數之間用乙個空格隔開,其中si表示編號為i的選手的初始分數。
第三行是2×n個正整數w1,w2,…,w2n,每兩個數之間用乙個空格隔開,其中wi表示編號為i的選手的實力值。
【輸出格式】
乙個整數,即r輪比賽結束後,排名第q的選手的編號。
【輸入樣例】
2 4 2
7 6 6 7
10 5 20 15
【輸出樣例】
1解題思路:先按初始分數排序,然後按分數高低兩人一組比賽勝者入勝者隊,負者入敗者隊。這樣兩個隊自身仍是有序的,只需進行合併操作即可,合併操作的複雜度是o(n),而如果用快排其複雜度為o(nlogn)
#include
using
namespace std;
const
int max =
200005
;int n, r, q;
int win_size, lose_size;
struct player
player[max]
, win[max]
, lose[max]
;bool
cmp(player p1, player p2)
void
merging()
while
(i <= win_size)
player[k++
]= win[i++];
while
(j <= lose_size)
player[k++
]= lose[j++];
}int
main()
sort
(player +
1, player +1+
2* n, cmp)
;for
(int i =
1; i <= r; i++
)else
}merging()
;}cout << player[q]
.num;
return0;
}
洛谷 P1309 瑞士輪(歸併排序)
在雙人對決的競技性比賽,如桌球 羽毛球 西洋棋中,最常見的賽制是淘汰賽和迴圈賽。前者的特點是比賽場數少,每場都緊張刺激,但偶然性較高。後者的特點是較為公平,偶然性較低,但比賽過程往往十分冗長。本題中介紹的瑞士輪賽制,因最早使用於18951895年在瑞士舉辦的西洋棋比賽而得名。它可以看作是淘汰賽與迴圈...
洛谷 P1309 瑞士輪(歸併)
題意 一共2n個人 有乙個初始分數 進行k輪比賽,每輪比賽按當前得分排出名次,然後比賽按照第1名和第2名,第3和第4 第2n 1和2n進行 實力各不相同且實力大的總能獲勝 獲勝方加一分,失敗方分數不變。思路 一開始想在每輪比賽前用sort排序,算了下複雜度大概o n n logn n k 顯然不行。...
洛谷 P1309 瑞士輪 歸併
每一輪快排,超時 include include include include using namespace std class athlete athlete int id,int competence,int score id id competence competence score s...