这是一道很水的模拟题
只要你知道了算法思路,代码是很好打出来的。
题意解析:
本题的题目看似复杂,但其实可以总结为一句话:
对于任意一个人(比如说你),如果有一个人的一个能力值比你高,那么只要保证你自己的另一个能力不小于他,那么你就是牛人。
算法思路:
知道了这一点后,我们就可以将所有人以其中一个能力作为关键词排序,再将第一个能力相同的人以另一种能力作为关键词排序。
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);
}
原文地址:https://www.cnblogs.com/Point-King/p/9829538.html
时间: 2024-10-11 08:01:36