【思维】B. Running for Gold

142 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

链接

codeforces.com/problemset/…
在这里插入图片描述

n个人每个人进行五场比赛,每场比赛有一个排名,如果一个人有至少三场比赛赢了另一个人,那么这个人对另一个人是胜利的。求n个人中可能产生的冠军是谁?


首先要明确两个人必须有一个人是胜者,比赛中不会出现两个胜利者的情况

按照比赛规则对所有人进行排序,第一个人就是可能产生的冠军。

然后对第一个人和后面的所有人进行判断,如果无法战胜所有的其他人的话,就不存在胜者
注意:如果胜者存在,排序后的第一个人一定是胜者


#include<bits/stdc++.h>
using namespace std;

using ll = long long;
const int mod = 1e9 + 7;

void solve()
{
	int n;
	cin >> n;
	vector<array<int, 6>> a(n + 1);
	
	for(int i = 1; i <= n; i++)
	{
		for(int j = 0; j < 5; j++)
			cin >> a[i][j];
		a[i][5] = i;
	}
	
	sort(a.begin() + 1, a.end(), [](auto x, auto y){
		int cnt = 0;
		for(int i = 0; i < 5; i++)
			cnt += (x[i] < y[i]);
		return cnt >= 3;
	});

	
	bool is = true;
	for(int i = 2; i <= n; i++)
	{
		int cnt = 0;
		for(int j = 0; j < 5; j++)
			cnt += (a[1][j] < a[i][j]);
		if(cnt < 3) is = false;
	}
	cout << (is ? a[1][5] : -1) << "\n";
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin >> t;
//	t = 1;
	while(t--) 
		solve();
	return 0;
}