Codeforces Global Round 15_B. Running for Gold

B. Running for Gold

题目传送门:

题目传送门

题面:

在这里插入图片描述

题目大意:

意思是n个运动员一起比赛5次,按照顺序输出每名运动员5场不同成绩。
找出最棒的那个运动员。
对于最棒运动员的定义:

  1. 比较方法:有三场比赛优于对方。
  2. 优于所有人的为所求。
    没有这样的人就输出-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;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值