贪心分组问题

发布时间 2024-01-08 17:04:09作者: TomLove

贪心区间分组

image-20240108155719885

image-20240108160346475

#include<iostream>
#include<algorithm>
#include<queue>

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(){
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++){
        int l, r;
        scanf("%d%d", &l, &r);
        range[i] = {l, r};
    }
    
    sort(range, range + n);
    
    priority_queue<int, vector<int>, greater<int>> heap; // 小根堆, 用来记录每个分组区间的最右侧端点
    // 小根堆会自动对堆中的元素进行排序,小的放在堆顶 heap.top()  取得堆顶元素
    // heap.pop() 弹出堆顶元素, 删除的意思
    // heap.push(i) 向堆中插入元素 i
    
    for(int i = 0; i < n; i++){
        auto r = range[i];
        if(heap.empty() || heap.top() >= r.l) heap.push(r.r);
        else{
            heap.pop();
            heap.push(r.r);
        }
    }
    
    printf("%d", heap.size());
    
    return 0;
}