【补题】Codeforces Global Round 15 B. Running for Gold
题意: n个人打了5场比赛,问有没有人能赢其他人5场里至少3场的
思路:【CF1552B Running for Gold】题解 - 洛谷专栏
首先假设这个人存在,那么他一定能赢其他所有人至少3场,这也就代表其他人都不可能赢他三场,不存在同时两个人完成这件事的可能,因此按照胜场数排序,这个排序虽然没有真正的递增性,但是如果存在这个人,那么一定是第一个
因此对第一个人重新进行判断,因为排名没有传递性,所以利用sort排出来的第一人,不一定就满足了题目的要求,但是如果有,那只可能是第一个人
感觉这种观察加排序的没咋遇到过,没啥想法,记录一下
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS \std::ios::sync_with_stdio(0); \std::cin.tie(0); \std::cout.tie(0)const int N = 3e5 + 5;
const int INF = 1e18;
// const int MOD = 998244353;
// const int MOD=1e9+7;
// const int MOD=100003;
const int maxn=5e5+10;int ve[N][5];int cmp(const int& a,const int& b){int num=0;for(int i=0;i<5;i++){if(ve[a][i]<ve[b][i])num++;}return num>=3;
}void solve(){int n;std::cin >> n;std::vector<int> ans(n);for(int i=1;i<=n;i++){ans[i-1]=i;for(int j=0;j<5;j++){std::cin >> ve[i][j];}}sort(ans.begin(),ans.end(),cmp);// for(auto i : ans ) std::cout << i << " ";// std::cout << '\n';for(int i=1;i<=n;i++){if(i==ans[0]) continue;int num=0;for(int j=0;j<5;j++){if(ve[ans[0]][j]<ve[i][j])num++;}if(num<3){std::cout << -1 << '\n';return ;}}std::cout << ans[0] << '\n';}signed main(){IOS;int t=1;std::cin >> t;while(t--){solve();}
}