$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
思路:
1. 将所有区间按左端点进行排序
2. 最小组:组内区间最大的右端点最小的组
3. 如果当前区间的左端点比最小组区间的右端点还大,则将最小组区间替换成当前区间
4. 如果当前区间的左端点比最小组区间的右端点还小,就开一个新组
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
struct Range
{
int l,r;
bool operator<(const Range &w)const
{
return l<w.l;
}
}range[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int l,r;
cin>>l>>r;
range[i]={l,r};
}
sort(range,range+n); //按区间的左端点进行排序
priority_queue<int,vector<int>,greater<int>> heap; //建立小根堆
for(int i=0;i<n;i++)
{
if(!heap.empty()&&range[i].l>heap.top()) heap.pop(); //可以放入最小组
heap.push(range[i].r); //若没有pop,则为开新组;若有pop,则为替换
}
cout<<heap.size()<<endl;
return 0;
}