题目大意:emmmmm……中文题,不用解释了吧
解题思路:
一开始是直接就想着排个序然后开始枚举,目前水平对时间复杂度还不太会算,但是听了别人的分析,会超时,枚举肯定不行,所以就要换个思维。
题目要求被完虐的电脑数量,什么叫做被完虐呢,就是内存和速度都比别台电脑差,假如有一台电脑,存在任意一台电脑两项的值都比它大一些,那这台电脑就被完虐。因为每台电脑有2个数要比较,所以我们可以开结构体,先对其中的一个参数排好序,然后在后面比较时只要比较一个参数即可。怎么比较呢?枚举的思想是,假如我们从第i个开始比较,那么我们就要把前i-1个都比一遍,全部循环下来会超时,所以不行。根据前缀数组的思想,我们只要从第一个开始比较,第1个和第0个比(最大值就是它自己),然后第2个和前1个的最大值比,第3个和前两个的最大值比,以此类推,开一个新的数组来记录每次比较出的最大值,然后后面再用一个循环将这个新的数组和原来的排列进行比较,不符合的则记录。
代码代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int n,ans;
int pre[maxn];
bool flag;
struct node
{
int m,v;
bool operator < (const node &a)const
{
return m>a.m;
}
} mapn[maxn];
int main()
{
while(cin>>n)
{
for(int i=0; i<n; i++)
{
cin>>mapn[i].m>>mapn[i].v;
}
sort(mapn,mapn+n);
pre[0]=mapn[0].v;
for(int i=1; i<n; i++)
{
pre[i]=max(mapn[i].v,pre[i-1]);
}
ans=0;
for(int i=1; i<n; i++)
{
if(pre[i-1]>mapn[i].v) ans++;
}
cout<<ans<<endl;
}
return 0;
}