题目大意:
题目给出n个点,求出有多少点满足没有横纵坐标同时大于等于这个点的个数。也就是在这所有的点中,这样的点有多少个?什么样的点呢?设这个点(x0,y0),那么如果不存在(x,y)使得x>=x0并且y>=y0,那么这就算一个点,求出所有这样的点。
算法:
我们可以竖杆子,什么意思,就是如果x相同,那么按照y从小到大排序。那么我们会发现x-y坐标轴上是一根根杆子,那么我们从后面开始,第一个点肯定算一个,因为他的x和y都是最大的,没有谁大过它。 然后往前走,由于是按照x排序,再按照y排序,所以如果前面的y小于当前的y,那么它肯定不是,因为x一定小于当前的x。所以就相当于找出大于最后一个y的点,算是第二个,然后再把这个y当做最大值,往前继续找比他大的,如果有,算一个,更新最大值,知道第一个点。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct Point
{
int x;
int y;
};
bool cmp(const Point &a, const Point &b)
{
if (a.x == b.x)
{
return a.y < b.y;
}
else
return a.x < b.x;
}
int main()
{
Point p[50001];
int num;
while (scanf("%d", &num),num)
{
for (int i = 0; i < num; i ++)
{
scanf("%d %d", &p[i].x, &p[i].y);
}
sort(p, p + num, cmp);
int ans = 1;
int mMax = p[num - 1].y;
for (int i = num - 2; i >= 0; i --)
{
if (mMax < p[i].y)
{
mMax = p[i].y;
ans ++;
}
}
printf("%d\n",ans);
}
return 0;
}
代码很简单,就不做注释了。