https://codeforces.com/problemset/problem/1552/B
题意:
n个人五项指标,给出每项指标的所有人的排名。如果一个人有至少三项比另一个人排名靠前,那么这个人就可以打败他。
问有哪些人可能打败所有人。多解输出任意一个人,可能无解。
一开始想a如果比b厉害就a向b连边,入度为0的点就可能是冠军。
但是这样是n^2的,然后就卡住了
但其实这行图是一张竞赛图,最多有1个入度为0的点
所以就从第一个往后扫,只要打不过就替换,最后得到的那个人再从第1个开始判断打不打得过,都打得过就是最后的冠军。有打不过的就无解。
因为假设最后剩下的是x,x已经确定能打得过x后面的人。答案要么是x,要么无解,所以再判断x能不能打得过他前面的即可。
#include<bits/stdc++.h> using namespace std; #define N 50003 int r[N][6]; bool check(int a,int b) { int s=0; for(int i=1;i<=5;++i) if(r[a][i]<r[b][i]) ++s; return s>=3; } int main() { int T,n,m; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;++i) for(int j=1;j<=5;++j) scanf("%d",&r[i][j]); m=1; for(int i=2;i<=n;++i) if(!check(m,i)) m=i; for(int i=1;i<m && m!=-1;++i) if(!check(m,i)) m=-1; printf("%d\n",m); } }