题目:
给定 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
思路:
这道题是道贪心题,要注意的是要求被删除的区间的个数,那么尽量把区间范围小的留下来,区间范围大的删去,这样结果才会正确。
代码如下:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
int l;//区间的左端点;
int r;//区间的右端点;
} a[40001];
bool cmp(node q,node w)
{
if(q.r!=w.r)
return q.r<w.r;//按照右边界从小到大排序;
else
return q.l>w.l;//如果右边界相同,就把左边界从大到小进行排序;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,q,w,sum=1,k=0;//sum统计不用删去的区间个数
for(i=0; i<n; i++)
{
scanf("%d%d",&q,&w);
if(q<w) //左右边界的大小要重新排序;
{
a[i].l=q;
a[i].r=w;
}
else
{
a[i].l=w;
a[i].r=q;
}
}
sort(a,a+n,cmp);
/*for(i=0;i<n;i++)
{
printf("%d %d\n",a[i].l,a[i].r);
}*/
k=a[0].r;
for(i=1; i<n; i++)
{
if(a[i].l>k)
{
sum++;//如果左边界大于上一个的右边界,这这个区间就不用删去;
k=a[i].r;
}
}
printf("%d\n",n-sum);
}
return 0;
}