CF1552B B. Running for Gold

https://codeforces.com/problemset/problem/1552/B

 

题意:

n个人五项指标,给出每项指标的所有人的排名。如果一个人有至少三项比另一个人排名靠前,那么这个人就可以打败他。

问有哪些人可能打败所有人。多解输出任意一个人,可能无解。

 

一开始想a如果比b厉害就a向b连边,入度为0的点就可能是冠军。

但是这样是n^2的,然后就卡住了

但其实这行图是一张竞赛图,最多有1个入度为0的点

所以就从第一个往后扫,只要打不过就替换,最后得到的那个人再从第1个开始判断打不打得过,都打得过就是最后的冠军。有打不过的就无解。

因为假设最后剩下的是x,x已经确定能打得过x后面的人。答案要么是x,要么无解,所以再判断x能不能打得过他前面的即可。

 

#include<bits/stdc++.h>

using namespace std;

#define N 50003

int r[N][6];

bool check(int a,int b)
{
    int s=0;
    for(int i=1;i<=5;++i) 
        if(r[a][i]<r[b][i]) ++s;
    return s>=3;
}

int main()
{
    int T,n,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i) 
            for(int j=1;j<=5;++j)
                scanf("%d",&r[i][j]);
        m=1;
        for(int i=2;i<=n;++i)
            if(!check(m,i)) m=i;
        for(int i=1;i<m && m!=-1;++i)
            if(!check(m,i)) m=-1;
        printf("%d\n",m);
    }
}

 

上一篇:Python-操作excel-003(封装读取excel类


下一篇:洛谷 P3961 [TJOI2013]黄金矿工(分组背包,01背包的变形)