20181019测试:T2牛人

Posted point-king

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20181019测试:T2牛人相关的知识,希望对你有一定的参考价值。

这是一道很水的模拟题

只要你知道了算法思路,代码是很好打出来的。

题意解析:

本题的题目看似复杂,但其实可以总结为一句话:

对于任意一个人(比如说你),如果有一个人的一个能力值比你高,那么只要保证你自己的另一个能力不小于他,那么你就是牛人。

算法思路:

知道了这一点后,我们就可以将所有人以其中一个能力作为关键词排序,再将第一个能力相同的人以另一种能力作为关键词排序。

bool cmp(People a,People b)
{
    if(a.a!=b.a)
    {
        return a.a<b.a;
    }
    return a.b>b.b;
}

这样的话,对于每一个人,我们只需要在第一个能力比自己大的人中进行遍历就可以了。

优化:

我们可以用一个数组best[i]从第一个能力值最大的人到i中最大的另一个能力值,对于每一个数,直接与这个best进行比较就可以了,这样就可以把复杂度降到O(n)。

bestb[n]=s[n].b;
for(int i=n-1;i>=1;--i)
{
    bestb[i]=bestb[i+1];
    if(s[i].b>bestb[i])
    {
        bestb[i]=s[i].b;
    }
}

小贴士:

如果是第一个能力值最大的人,那么他一定是牛人!!!

贴代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
struct People
{
    int a,b;
};
People s[100005];
bool cmp(People a,People b)
{
    if(a.a!=b.a)
    {
        return a.a<b.a;
    }
    return a.b>b.b;
}
int n,ans;
int besta,bestb[100005];
int main()
{
    freopen("niuren.in","r",stdin);
    freopen("niuren.out","w",stdout);
    scanf("%d",&n);
    ans=n;
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&s[i].a);
    }
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&s[i].b);
    }
    sort(s+1,s+1+n,cmp);
    besta=s[n].a;
    bestb[n]=s[n].b;
    for(int i=n-1;i>=1;--i)
    {
        bestb[i]=bestb[i+1];
        if(s[i].b>bestb[i])
        {
            bestb[i]=s[i].b;
        }
    }
    for(int i=1;i<=n;++i)
    {
        if(s[i].a!=besta&&s[i].b<bestb[i+1])
        {
            --ans;
        }
    }
    printf("%d",ans);
}

以上是关于20181019测试:T2牛人的主要内容,如果未能解决你的问题,请参考以下文章

20181019-JSP 教程/简介

20181019T1加密逆元+位运算

test20181019 B君的第三题

2018 女生赛 F - 赛题分析

七牛上传视频并转码

[考试反思]0929csp-s模拟测试55:沦陷