B. Running for Gold
题目传送门:
题面:
题目大意:
意思是n个运动员一起比赛5次,按照顺序输出每名运动员5场不同成绩。
找出最棒的那个运动员。
对于最棒运动员的定义:
- 比较方法:有三场比赛优于对方。
- 优于所有人的为所求。
没有这样的人就输出-1;反之输出最棒序号(多个取其一即可)。
思路:
其实当时比赛的时候,觉得判断三场优于的比较方法很苦手,而且搞不清楚互相打结的运动员情况,心里慌慌的。但是过的人很多,我就冲了,也过了。
赛后讨论如下:
先通过比较方式求出暂时的冠军,但是强弱之间是没有传递关系的,A比B强,B比C强,但是C有可能比A强。就像样例2那里一样会打结。
所以最后还要用暂时的那个冠军去遍历一遍,真的胜利就输出,反之则没有冠军。
因为暂时的冠军已经是在第一轮比赛中是比所有人都强的,所以他都不是冠军的话就没有冠军了。
这个思维还是很巧妙的。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5e4 + 100;
struct Node {
int id;
int a, b, c, d, e;
} node[maxn];
bool cmp(Node x, Node y) {
int xx = 0, yy = 0;
if (x.a < y.a) xx++; else yy++;
if (x.b < y.b) xx++; else yy++;
if (x.c < y.c) xx++; else yy++;
if (x.d < y.d) xx++; else yy++;
if (x.e < y.e) xx++; else yy++;
return xx > yy;
}
int main() {
int T;
cin >> T;
while (T--) {
int n;
int t;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> node[i].a >> node[i].b >> node[i].c >> node[i].d >> node[i].e;
node[i].id = i;
}
sort(node + 1, node + 1 + n, cmp);
int flag = 1;
for (int i = 2; i <= n; i++) {
if (!cmp(node[1], node[i])) {
flag = 0;
break;
}
}
if (flag)cout << node[1].id << endl;
else cout << -1 << endl;
}
}