最大不相交区间数量----------acwing

给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。

输出可选取区间的最大数量。

输入格式

第一行包含整数 N,表示区间数。

接下来 N 行,每行包含两个整数 ai,bi表示一个区间的两个端点。

输出格式

输出一个整数,表示可选取区间的最大数量。

数据范围

1≤N≤10^5
−10^9≤ai≤bi≤10^9

输入样例:
3
-1 1
2 4
3 5
输出样例:
2

思路:

题意:数轴上有一些区间,选取几个区间,要求所选的区间没有重合部分,求最多能选多个区间。

此题为贪心+区间问题,要保证最多,就要保证右端点是较小的,因为右端点越小,我们能比较的区间就更多。


这里给出两种写法:

 图解:

最大不相交区间数量----------acwing_第1张图片 


AC代码: 

#include

using namespace std;

const int N = 1e5+10;
typedef pair PII;
PII segs[N];
int n;

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ )
    {
        //输入区间坐标
        cin >> segs[i].first >> segs[i].second;
    }
    sort(segs,segs+n);//按照正常左端点排序
    int res = 1,ed = segs[0].second; //默认有一个区间
    //枚举所有区间
    for(int i=1;i= segs[i].first)
        {
            //只有保证右面最小的情况,才能保证更大。
            ed = min(ed,segs[i].second);
        }
        else 
        {
            //当前区间左端点大于上一个的右端点拿到集合中
            res ++;
            ed = segs[i].second; //更新成新的右端点
        }
    }
    cout << res;
    return 0;
}
#include

using namespace std;
const int N = 1e5+10;
int n;

struct seg
{
    int l,r;
    //重载小于号,让排序按照右端点排序(因为这么排序可以保证右端点是小的)
    bool operator < (const seg &e) const
    {
        return r < e.r;
    }
}segs[N];

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ )
    {
        cin >> segs[i].l >> segs[i].r;
    }
    
    sort(segs,segs+n);
    int res = 1,ed = segs[0].r;
    for (int i = 1; i < n; i ++ )
    {
        if(ed < segs[i].l)
        {
            res++;
            ed = segs[i].r;
        }
    }
    cout << res;
    return 0;
}

 两个代码的区别就在于第一个代码 min处理的很好,保证左面区间永远是当前区间里最小的

你可能感兴趣的:(题解,算法,数据结构,c++)