NOIP2011普及組第3題 瑞士輪

2021-08-22 08:43:21 字數 2007 閱讀 9516

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的選手的實力值。

【資料範圍】 

對於 30%的資料,1 ≤ n≤ 100; 

對於 50%的資料,1 ≤ n≤ 10,000; 

對於 100%的資料, 1 ≤ n≤ 100,000, 1 ≤ r≤ 50, 1 ≤ q≤ 2n, 0 ≤ s1, s2, …, s2n ≤ 108

, 1 ≤ w1, w2, …, w2n ≤ 108

。輸出只有一行,包含乙個整數,即r輪比賽結束後,排名第q的選手的編號。

2 4 2

7 6 6 7

10 5 20 15

1
這題可以考慮排序,第一輪直接排序,求出結果。接著我們注意到,每一輪必定會產生n個勝利者得分,n個失敗者不得分,這兩組各自內部的排名是不變的。我們可以考慮把他們分開處理。則只需要合併的操作。時間複雜度為o(nlogn+n*r)。

1、定義結構體儲存資料,包括選手的編號、分數、實力;

2、首先用sort()函式對資料進行一次快排,按照分數從大到小,如果分數相同,編號小的在前;

3、參照題意進行模擬,每輪比賽後需要根據分數進行重新排序

① 若是用sort()函式進行快排,tle超時;

②對資料進行分析,每輪比賽後,可將勝利者分為一組,負者分為一組;而這兩組資料本身是排好序的(從大到小),因此考慮使用歸

並排序;

4、最後的題解可以理解為 模擬+歸併

#include#includeusing namespace std;

int n,r,q;

struct nodewh[200001],win[200001],fa[200001];//存當前得分,勝利者,失敗者

bool cmp(node a,node b)

void pp(int n,int r)

if(wh[i].w fa[y].s )

wh[i++]=win[x++];

if(win[x].sfa[y].ni )

wh[i++]=fa[y++];

} if(x>n/2)//勝利的存入完後,把剩餘的失敗的接著存入

while(y<=n/2)

wh[i++]=fa[y++];

else//失敗的存入完後,把剩餘的勝利的接著存入

while(x<=n/2)

wh[i++]=win[x++]; }}

int main()

for(i=1;i<=n;i++)

scanf("%d",&wh[i].w );//輸入能力值

sort(wh+1,wh+n+1,cmp);//按照要求排序

pp(n,r);//呼叫work()函式,進行r場比賽,得到最終排名

printf("%d\n",wh[q].ni );//輸出第q的編號

return 0;

}

noip2011普及組第四題

要用棧寫比較方便,速度也還挺快o n 主要是每遇到乙個非括號符號就插兩個數進數字棧裡,遇到符號就從優先順序入手,比如匹配到加號然後棧裡面有乘號就要先解決棧裡面的乘號,直到遇到 符號為止。有乙個小技巧就是開頭先再字串後面加乙個 再把左括號加入棧內。等下就不用去清棧,可以保證執行完後棧必空。includ...

NOIP2011普及組 瑞士輪

題目 洛谷p1309 codevs1132 vijos p1771 題目大意 要你模擬瑞士輪賽制,求出r輪後第q名選手的編號。解題思路 首先對所有選手按分數從大到小進行排序,然後模擬比賽。因為原本是排好序的,贏的加1分,輸的扣1分,所以贏的人和輸的人也是分別有序的。所以我們可以把每輪贏的人扔進乙個陣...

NOIP 2011普及組 瑞士輪

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