【題目】
time limit: 1 sec memory limit: 128 mb
submit: 85 solved: 24
[submit][status][web board]
在雙人對決的競技性比賽,如桌球、羽毛球、西洋棋中,最常見的賽制是淘汰賽和迴圈賽。前者的特點是比賽場數少,每場都緊張刺激,但偶然性較高。後者的特點是較為公平,偶然性較低,但比賽過程往往十分冗長。
本題中介紹的瑞士輪賽制,因最早使用於 1895 年在瑞士舉辦的西洋棋比賽而得名。
它可以看作是淘汰賽與迴圈賽的折衷,既保證了比賽的穩定性,又能使賽程不至於過長。
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,每兩個數之間用乙個空格隔開,其中 s 表示編號為 i 的選手的初始分數。
第三行是 2*n個正整數 w1, w2, …, w2n,每兩個數之間用乙個空格隔開,其中 w 表示編號為 i 的選手的實力值。
輸出只有一行,包含乙個整數,即 r 輪比賽結束後,排名第 q 的選手的編號。
2 4 2
7 6 6 7
10 5 20 15
1
本輪對陣
本輪結束後的得分
選手編號/①
②③④初始
/766
7第1輪
①—④ ②—③76
78第2輪④—① ③—②76
89第3輪④—③ ①—②86
99第4輪③—④ ①—②96
109資料範圍:
對於 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。
【題解】
題意: 2*n名選手根據分數排序進行r 輪比賽,最後輸出名次 q的選手編號。
思路:我們發現每一次排序之後勝方和敗方的相對前後順序都不會改變,因此很容易想到歸併排序:將第一次排序後的陣列根據實力分成二組a、b,組a為勝方,組b為敗方,再將組a與組b根據實力得到的勝負各自再分為兩組,依次類推,當分出來的小組只有乙個資料時,可以認為這個小組已經達到了有序,然後再判斷合併相鄰的二個小組就可以了。這樣通過先遞迴分解數列,再合併數列就完成了歸併排序。
【**】
#includeusing namespace std;
struct pa[200002],b[200002],ans[200002];
int n;
bool cmp(p a,p b)
void solve()
else
}int i=1,j=1,k=1;
while(iwhile(ians[k++]=a[i++];
while(jans[k++]=b[j++];
}int main()
for(i=1;i<=n*2;i++)
scanf("%d",&ans[i].w);
sort(ans+1,ans+2*n+1,cmp);
for(i=0;isolve();
printf("%d\n",ans[q].num);
return 0;
}
codevs1132 瑞士輪 歸併排序
分析 如果每次 n 100000 排序,共進行r輪 r n logn 50 100000 20 10 8,超時 第一次排序後 每次贏的和輸的隊伍分別有序,只需要 o n 的歸併排序,時間複雜度變為5 10 6,不再超時。include include sort using namespace std...
P1309 瑞士輪 歸併排序
題目鏈結 題目背景 在雙人對決的競技性比賽,如桌球 羽毛球 西洋棋中,最常見的賽制是淘汰賽和迴圈賽。前者的特點是比賽場數少,每場都緊張刺激,但偶然性較高。後者的特點是較為公平,偶然性較低,但比賽過程往往十分冗長。本題中介紹的瑞士輪賽制,因最早使用於1895年在瑞士舉辦的西洋棋比賽而得名。它可以看作是...
歸併排序P1309 瑞士輪
題目點這裡 剛開始想用sort一遍一遍的排,最後發現超時只能過70 看了大佬們的題解才知道要用歸併排序,sort適合隨機的數列。sort時間複雜度不穩定 o nlogn 可能還會更高 歸併排序時間複雜度穩定 o n 詳細看 include include using namespace std st...