• 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
    ",m);
        }
    }
    作者:xxy
    本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。
  • 相关阅读:
    软件工程第一次作业--IT女的进化
    软件工程第五次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    v0.1beta
    第二次结对作业
    软件工程结对作业
    软件工程第三次作业
    软件工程第二次作业
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/15225075.html
Copyright © 2020-2023  润新知