在雙人對決的競技性比賽,如桌球、羽毛球、西洋棋中,最常見的賽制是淘汰賽和迴圈賽。前者的特點是比賽場數少,每場都緊張刺激,但偶然性較高。後者的特點是較為公平,偶然性較低,但比賽過程往往十分冗長。
本題中介紹的瑞士輪賽制,因最早使用於18952023年在瑞士舉辦的西洋棋比賽而得名。它可以看作是淘汰賽與迴圈賽的折中,既保證了比賽的穩定性,又能使賽程不至於過長。
2 \times n2×n 名編號為 1\sim 2n1∼2n 的選手共進行r 輪比賽。每輪比賽開始前,以及所有比賽結束後,都會按照總分從高到低對選手進行一次排名。選手的總分為第一輪開始前的初始分數加上已參加過的所有比賽的得分和。總分相同的,約定編號較小的選手排名靠前。
每輪比賽的對陣安排與該輪比賽開始前的排名有關:第11 名和第22 名、第 33 名和第 44名、……、第2k - 12k−1名和第2k2k名、…… 、第2n - 12n−1名和第2n2n名,各進行一場比賽。每場比賽勝者得11分,負者得 00分。也就是說除了首輪以外,其它輪比賽的安排均不能事先確定,而是要取決於選手在之前比賽中的表現。
現給定每個選手的初始分數及其實力值,試計算在r 輪比賽過後,排名第qq 的選手編號是多少。我們假設選手的實力值兩兩不同,且每場比賽中實力值較高的總能獲勝。
第一行是三個正整數n,r ,qn,r,q,每兩個數之間用乙個空格隔開,表示有 2 \times n2×n名選手、rr 輪比賽,以及我們關心的名次 qq。
第二行是2 \times n2×n 個非負整數s_1, s_2, …, s_s1,s2,…,s2n,每兩個數之間用乙個空格隔開,其中s_isi表示編號為ii 的選手的初始分數。 第三行是2 \times n2×n 個正整數w_1 , w_2 , …, w_w1,w2,…,w2n,每兩個數之間用乙個空格隔開,其中 w_iwi 表示編號為ii 的選手的實力值。
乙個整數,即rr 輪比賽結束後,排名第qq 的選手的編號。
輸入
2 4 2輸出7 6 6 7
10 5 20 15
1sort超時了,所以我們要重新分析問題。在比賽過程中,每經過一輪,選手的分數幾乎沒變化,只是小範圍的變動,資料較有序,因此我們可以用歸併排序的思想,將每輪的贏家和輸家進行合併(贏家與輸家的陣列都是有序的,相當於最後一次歸併排序),此時時間複雜度是o(n)。
#include #include using namespace std;
struct node;
node win[100005],lose[100005],a[200005];
int n,q,r;
bool cmp(node a,node b)
void merge()
else
}while(i<=n)
while(j<=n)
} int main()
for(int i=1;i<=n1;i++)
sort(a+1,a+1+n1,cmp);
for(int j=1;j<=r;j++)
else
}merge();
} sort(a+1,a+1+n,cmp);
cout
}
洛谷P1309 瑞士輪(模擬,歸併排序)
題目描述 2 n名編號為1 2n的選手共進行r輪比賽。每輪比賽開始前,以及所有比賽結束後,都會按照總分從高到低對選手進行一次排名。選手的總分為第一輪開始前的初始分數加上已參加過的所有比賽的得分和。總分相同的,約定編號較小的選手排名靠前。每輪比賽的對陣安排與該輪比賽開始前的排名有關 第1名和第2名 第...
洛谷 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...