(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
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N = 100010;

int n;
struct qujian{
    int l,r;
    bool operator<(struct qujian& a){
        return l<a.l;
    }
}arr[N];

int main()
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>arr[i].l>>arr[i].r;
    
    priority_queue<int, vector<int>, greater<int>> heap;
    
    /*定义小根堆
    less<T>变成升序(从左到右遍历下标时,数组元素是从小到大)
    greater<T>变成降序(从左到右遍历下标时,数组元素是从大到小)

    那么也就意味着 less模式下,优先输出的较大的数值, greater模式下优先输出的较小的数值;*/
        
    sort(arr,arr+n);
    //按照区间的左端点从小到大排序
    
    for(int i=0;i<n;i++)
    {
        if(heap.empty()||heap.top()>=arr[i].l) heap.push(arr[i].r); 
        //如果小根堆为空或者其组内的最大右端点大于等于当前需要加入的区间的左端点(有交集),则都需要再开辟一个新的组进行存储区间
        else{
            heap.pop();//每次弹出的是右端点最小的,放入可加入的当前的区间的右端点,这样就可以更新每个组的最大的右端点
            heap.push(arr[i].r);
        }
    }
    
    cout<<heap.size()<<endl;
    
}

 

猜你喜欢

转载自blog.csdn.net/GF0919/article/details/131882413