水题讲解:瑞士轮
題目背景
在雙人對決的競技性比賽,如乒乓球、羽毛球、國際象棋中,最常見的賽制是淘汰賽和循環賽。前者的特點是比賽場數少,每場都緊張刺激,但偶然性較高。后者的特點是較為公平,偶然性較低,但比賽過程往往十分冗長。
本題中介紹的瑞士輪賽制,因最早使用于1895年在瑞士舉辦的國際象棋比賽而得名。它可以看作是淘汰賽與循環賽的折衷,既保證了比賽的穩定性,又能使賽程不至于過長。
題目描述
2*N 名編號為 1~2N 的選手共進行R 輪比賽。每輪比賽開始前,以及所有比賽結束后,都會按照總分從高到低對選手進行一次排名。選手的總分為第一輪開始前的初始分數加上已參加過的所有比賽的得分和。總分相同的,約定編號較小的選手排名靠前。
每輪比賽的對陣安排與該輪比賽開始前的排名有關:第1 名和第2 名、第 3 名和第 4名、……、第2K – 1 名和第 2K名、…… 、第2N – 1 名和第2N名,各進行一場比賽。每場比賽勝者得1 分,負者得 0 分。也就是說除了首輪以外,其它輪比賽的安排均不能事先確定,而是要取決于選手在之前比賽中的表現。
現給定每個選手的初始分數及其實力值,試計算在R 輪比賽過后,排名第 Q 的選手編號是多少。我們假設選手的實力值兩兩不同,且每場比賽中實力值較高的總能獲勝。
輸入輸出格式
輸入格式:
?
輸入文件名為swiss.in 。
輸入的第一行是三個正整數N、R 、Q,每兩個數之間用一個空格隔開,表示有 2*N 名選手、R 輪比賽,以及我們關心的名次 Q。
第二行是2*N 個非負整數s1, s2, …, s2N,每兩個數之間用一個空格隔開,其中 si 表示編號為i 的選手的初始分數。 第三行是2*N 個正整數w1 , w2 , …, w2N,每兩個數之間用一個空格隔開,其中 wi 表示編號為i 的選手的實力值。
?
輸出格式:
?
輸出文件名為swiss.out。
輸出只有一行,包含一個整數,即R 輪比賽結束后,排名第 Q 的選手的編號。
?
輸入輸出樣例
輸入樣例#1:2 4 2 7 6 6 7 10 5 20 15 輸出樣例#1:
1
說明
【樣例解釋】
【數據范圍】
對于30% 的數據,1 ≤ N ≤ 100;
對于50% 的數據,1 ≤ N ≤ 10,000 ;
對于100%的數據,1 ≤ N ≤ 100,000,1 ≤ R ≤ 50,1 ≤ Q ≤ 2N,0 ≤ s1, s2, …, s2N≤10^8,1 ≤w1, w2 , …, w2N≤ 10^8。
noip2011普及組第3題。
#include<cstdio> #include<algorithm> #define ct register int #define cr register char #define g() getchar() #define N 200005 #define fr(a,b,c,d) for(int a=b;a<=c;a+=d) int in(){ct f=1,x=0;cr c=g();for(;c<'0'||c>'9';c=g())f=(c=='-')?-1:1;for(;'0'<=c&&c<='9';c=g())x=(x<<3)+(x<<1)+(c^48);return x*f;} struct p{int ma,num,ab;}a[N],w[N],l[N]; bool cmp(p xx,p yy){if(xx.ma!=yy.ma)return xx.ma>yy.ma;return xx.num<yy.num;} using namespace std; int main(){ct n=in(),r=in(),q=in();fr(i,1,2*n,1)a[i].ma=in(),a[i].num=i;fr(i,1,2*n,1)a[i].ab=in();sort(a+1,a+1+2*n,cmp);fr(i,1,r,1){ct ww=0,ll=0;fr(j,1,2*n,2)(a[j].ab>a[j+1].ab)?(w[++ww]=a[j],l[++ll]=a[j+1]):(w[++ww]=a[j+1],l[++ll]=a[j]),w[ww].ma++;//this is a ternary operator//it means if:a[i].ab>a[j+1].ab,do the option before ':',or do the option after ':'merge(w+1,w+1+ww,l+1,l+1+ll,a+1,cmp);}printf("%d",a[q].num); } //well this is a good program about the using of merge_sort //maybe someone would like to use sort,but the fact tells us it can be a overtime_solution //how can we make some optimization,well merge_sort is the best_ans //we just need to set two array:win or lose //because the winner_group's order can be ordered ,so can loser_group(we have made a sort before) //the merge_sort's definition is :mix two ordered array into one ordered array //in this case,merge_sort can successfully satisfy the requirement?
轉載于:https://www.cnblogs.com/muzu/p/7618022.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: tensorflow--logistic
- 下一篇: 自助烤肉店怎么选址好?