区间选点
数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)
Input
第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)
Output
一个整数,代表选点的数目
Examples
Input
2
1 5
4 6
Output
1
Input
3
1 3
2 5
4 6
Output
2
我的思路:
这道题我是利用贪心算法解决的。在每个区域至少有一点,且点的数目最小的情况下,每一个点都应是已给一段区间的右端点。那么可以对右端点进行升序排序,若右端点相同则按照左端点降序排列。然后遍历这个序列,当前的点(排序后的第一段区间的右端点一定会选择)是否在遍历到的区间内,如果不在,则更换当前点为此区间的右端点,然后继续遍历,直到遍历结束。
我的代码:
#include<iostream>
#include<algorithm>
using namespace std;
int N;
struct ab
{
int a,b;
}_ab[100];
bool compare(const ab& x,const ab& y)
{
if(x.b==y.b) return x.a > y.a;
return x.b < y.b;
}
int main()
{
cin>>N;
for(int i=0;i<N;i++)
{
cin>>_ab[i].a>>_ab[i].b;
}
sort(_ab,_ab+N,compare);
int now = _ab[0].b,num=1;
for(int i=1;i<N;i++)
{
if(now<_ab[i].a)
{
num++;
now=_ab[i].b;
}
}
cout<<num;
return 0;
}