码迷,mamicode.com
首页 > 其他好文 > 详细

20181019测试:T2牛人

时间:2018-10-22 15:00:28      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:需要   iostream   个数   ack   一个人   直接   tac   一点   amp   

这是一道很水的模拟题

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

题意解析:

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

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

算法思路:

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

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牛人

标签:需要   iostream   个数   ack   一个人   直接   tac   一点   amp   

原文地址:https://www.cnblogs.com/Point-King/p/9829538.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!