现将每组数据按左边数据排序,然后依次遍历,将满足大小要求的挑出来,并将其对应得vis数组标记。
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std;
struct node
{
int left;
int right;
} p[5500];
bool cmp(node a,node b)
{
if(a.left==b.left)
return a.right<b.right;
else return a.left<b.left;
}
int vis[5500];
int main()
{
int N,n,i,j;
scanf("%d",&N);
while(N--)
{
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d %d",&p[i].left,&p[i].right);
}
sort(p,p+n,cmp);
int cnt=0;
for(i=0; i<n; i++)
{
if(vis[i]==0) // 直接在vis==0时进行操作,如果已经访问过就不管
{
vis[i]=1;
cnt++;
int pointer = p[i].right;
for(j=i+1; j<n; j++)
{
if(p[j].right>=pointer&&vis[j]==0)
{
vis[j]=1;
pointer=p[j].right; // 贡献了一次WA,最初并没有设置pointer,daozhi每次都是与p[i].right进行比较
}
}
}
}
printf("%d\n",cnt);
}
return 0;
}