Codeforces Global Round 15 (div1+div2) B
题意
有n (1≤n≤50000)个人参加比赛,比赛共有5场,给出这n个人在每场比赛的排名,判断是否存在冠军(胜了其他所有人)。
(如果x在>=3场比赛中赢了y,称x是相对y的胜者)
思路
idea1 O(n^2)
暴力枚举每个人,两两判断胜负情况
tle
idea2 O(n),极端情况退化到O(n^2)
容易发现,如果y被x打败过,则y一定不可能是胜者
我首先将把1打败的人放入一个新的集合,当集合的size>1时,用集合首元素分别与其他元素两两判断胜负,直到集合的size<=1
1.size==1
易知比赛中也可能没有冠军产生,故再用集合中剩余的元素与其他人依次比较
2.size==0
比赛没有冠军产生
分析
这种方法比第一种快,但是可能存在极端情况(选手随着index增加不断增强),这样来看最多需要改变所需集合n-1次,时间复杂度O(n^2)
tle
idea3
巧妙的排序
当给出n个选手的排名,问有没有冠军产生,首先想到了排序:
如果按照某种规则进行排序,只需要判断第一个元素是否能打败其他所有人即可
这时候我们重载一个小于号(或者重载大于号):
1 struct node{
2 int a[6];
3 int id;
4 bool operator < (const node &aa)const{
5 int cnt=0;
6 for(int k=1;k<=5;k++){
7 if(a[k]<aa.a[k]) cnt++;
8 }
9 return cnt>=3;
10 }
11 }A[50005];
sort(A+1,A+n+1);
1 struct node{
2 int a[6];
3 int id;
4 bool operator > (const node &aa)const{
5 int cnt=0;
6 for(int k=1;k<=5;k++){
7 if(a[k]<aa.a[k]) cnt++;
8 }
9 return cnt>=3;
10 }
11 }A[50005];
sort(A+1,A+n+1,greater<node>());
sort一下,时间复杂度O(nlogn)
由于sort()排序默认是从小到大,故一般是重载小于号;重载大于号再给sort函数加一个greater<T>()参数可以达到同样的效果
启示
结构体数组的排序可以任意制定规则,it's up to you!
by重载运算符(<,>,==)

浙公网安备 33010602011771号