区间选点(week3 作业B)

区间选点

数轴上有 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;
}

发布了26 篇原创文章 · 获赞 0 · 访问量 453

猜你喜欢

转载自blog.csdn.net/qq_43738677/article/details/104676743
今日推荐