题目:
给定 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
思路:
贪心思想,要想去掉最少区间数,意思就剩余最多的区间;
把区间按照右端点从小到大的顺序排列;
先让 r = 第一个区间的右端点;
从前往后遍历所有区间,如果遇到区间的左端点小于 r ,则这个区间就要删去;
如果遇到区间的左端点大于 r ,此区间保留,改变 r =此区间的右端点;
注意:
输入的每区间可能不是按照左端点、右端点的顺序输入的,必要时需要调换位置;
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct note
{
int x,y;
}e[100861];
bool cmp(note a,note b)
{
return a.y<b.y;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
int a,b,t;
scanf("%d%d",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
e[i].x=a;
e[i].y=b;
}
sort(e,e+n,cmp);
int sum=0,r=e[0].y;
for(int i=1;i<n;i++)
{
if(e[i].x<=r)
{
sum++;
}
else
{
r=e[i].y;
}
}
printf("%d\n",sum);
}
return 0;
}