给定 x 轴上 n 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。
★算法设计: 对于给定的 n 个闭区间,计算去掉的最少闭区间数。
Input
对于每组输入数据,输入数据的第一行是正整数 n (1<=n<=40,000),表示闭区间数。接下来的 n 行中,每行有 2 个整数,分别表示闭区间的 2 个端点。
Output
输出计算出的去掉的最少闭区间数。
Sample Input
3 10 20 15 10 20 15
Sample Output
2
题解:
把每个区间以y为参照从小到大排序,然后将y对下一个x进行比较,判断要删去几个区间。
贴代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int x,y;
} mp[40010];
bool cmp(node a,node b)///以y为参照进行排序。
{
if(a.y==b.y)
return a.x>b.x;
return a.y<b.y;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,j,t;
for(i=0; i<n; i++)
{
scanf("%d%d",&mp[i].x,&mp[i].y);
if(mp[i].x>mp[i].y)///将区间的x,y调整好。
{
t=mp[i].x;
mp[i].x=mp[i].y;
mp[i].y=t;
}
}
sort(mp,mp+n,cmp);
int sum=n-1,ans=mp[0].y;
for(i=1; i<n; i++)
{
if(ans<mp[i].x)///说明这两个区间不相连,要删去的区间减少一个。
{
ans=mp[i].y;
sum--;
}
}
printf("%d\n",sum);
}
return 0;
}