Codeforces Global Round 15 (div1+div2) B

题意

n (1n50000)个人参加比赛,比赛共有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重载运算符(<,>,==)

 

posted @ 2021-07-27 12:23  starlightlmy  阅读(91)  评论(0)    收藏  举报