题目:https://codeforces.com/problemset/problem/1552/B
题意:N个运动员,每个运动员有五场比赛记录,如果A有三场比赛的成绩赢了B,则说这个A赢了B,如果存在一个运动员优于所有运动员,则认为这个运动员可以获得冠军,要求你输出冠军的编号 或者 不存在冠军的时候输出-1 。
题解:如果存在一个运动员A是冠军,那A和任意运动员 比较都是胜利,所以如果A只要输了一次,那A一定不是冠军,因此,我们只需遍历N个运动员,每次都和winner比较,得出最后的赢家。? 再将赢家与所有人比较一次,得出是不是存在冠军。 ?
//#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int ll;
const int N = 2e5 + 5;
struct runner
{
int a[5];
}; runner run[N];
bool win(runner x, runner y)//比较赢家
{
int xwin = 0, ywin = 0;
for (int i = 0; i < 5; i++)
{
if (x.a[i] > y.a[i])
{
ywin++;
}
else
{
xwin++;
}
}
if (xwin > ywin)return 1;
else return 0;
}
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < 5; j++)
{
cin >> run[i].a[j];
}
}
int winner = 1;
for (int i = 1; i <= n; i++)
{
if (win(run[i], run[winner]))//如果有人赢了赢家
{
winner = i;
}
}
bool ok = 1;
for (int i = 1; i <= n; i++)//比较是不是赢了全部的人
{
if (i == winner)continue;
if (win(run[i],run[winner]))
{
ok = 0;
break;
}
}
if (ok)
{
cout << winner << endl;
}
else
{
cout << "-1" << endl;
}
}
}
|