题意:
链接: link.
有n个运动员,在过去的时间里,他们参加了五场比赛,以及他们获得的名次,问在这一场新的比赛里,根据他们过去的比赛,能不能预估出一个实力最强的选手,一个选手比另一个选手强的表现为五场比赛中有三场比赛名次靠前,问有没有一个选手胜过所有人,有的话输出第几个人
思路:
暴力:用n2的想法把每一个选手都比较一遍,根据数据规模会tle;
一个选手比其他所有人都赢,那么在暴力轮回赛制中一次都不能输,那么可以遍历一遍找到遍历一遍之后的虚拟最大者,相当于冒泡排序,找到一个最大的泡泡,但是这里面的比较方式不一样,a>b,b>c,推出a>c在这里不一定成立,所以还要遍历一遍确认一下这个虚拟选手是否大于所有选手。复杂度为n.
AC代码:
#include <bits/stdc++.h>
using namespace std;
int t, n;
#define N 55555
int arr[N][5];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--)
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 5; j++)
{
cin >> arr[i][j];
}
}
int x = 0;
for (int i = 1; i < n; i++)
{
int f = 0;
for (int j = 0; j < 5; j++)
{
if (arr[i][j] < arr[x][j])
f++;
}
if (f >= 3)
x = i;
}
int cnt = 0;
for (int i = 0; i < n; i++)
{
int f = 0;
for (int j = 0; j < 5; j++)
{
if (arr[x][j] < arr[i][j])
f++;
}
if (f >= 3)
cnt++;
}
if (cnt != n - 1)
{
puts("-1");
}
else
{
printf("%d\n", x + 1);
}
}
//system("pause");
return 0;
}