题意:
给你n个人五次成绩的排名,认为x比y强当且仅当x对应的排名至少有3个比y小。如果有一个人比所有的人强,那么他就有可能是冠军。问你谁可能会是冠军。
题解:
那么任意两个人比,都会有一个人输。因此我们只需要从头遍历一遍,同时维护胜利的人是谁。那么最后再看一遍这个人是不是和所有人比都胜利即可。
C++代码:
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
struct node{
int v[6];
bool operator< (const node& a)const {
int f=0;
for(int i=1;i<=5;i++){
if(v[i]<a.v[i])f++;
if(v[i]>a.v[i])f--;
}
return f<0;
}
}a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=5;j++)
scanf("%d",&a[i].v[j]);
int tmp=1;
for(int i=2;i<=n;i++)
if(a[tmp]<a[i])
tmp=i;
int f=0;
for(int i=1;i<=n;i++){
if(tmp==i)continue;
if(a[tmp]<a[i])f=1;
}
printf("%d\n",f?-1:tmp);
}
return 0;
}
Python代码:
a=[[0]*5]*50005
def cmp(i,tmp):
f = 0
for j in range(5):
if a[i][j] > a[tmp][j]:
f = f + 1
elif a[i][j] < a[tmp][j]:
f = f - 1
return f
t=int(input())
while t>0:
n=int(input())
for i in range(n):
a[i]=list(map(int,input().split(' ')))
tmp=0
for i in range(1,n):
if cmp(i,tmp)<0:
tmp=i
f=0
for i in range(n):
if i==tmp:
continue
if cmp(i,tmp)<0:
f=1
break
if f==1:
print(-1)
else:
print(tmp+1)
t=t-1