ACWing 906. 区间分组

ACWing 906. 区间分组

题目描述

给定 N 个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
输出最小组数

输入格式

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

输出格式

输出一个整数,表示最小组数。

数据范围

1 ≤ N ≤ 105
−109 ≤ ai ≤ bi ≤ 109

输入样例

3
-1 1
2 4
3 5

输出样例

2

Code注释版
#include
#include
#include
using namespace std;

const int N = 100010;
struct Range{
    int l, r;
}range[N];

bool cmp(struct Range a, struct Range b)
{
    return a.l < b.l;
}

int main()
{
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        cin >> l >> r;
        range[i] = {l, r};
    }
    
    // 按照左端点,从小到大进行排序
    sort (range, range + n, cmp);
    
    // 需要动态维护所有组的最小的max_r,这里用到小根堆
    priority_queue<int, vector<int>, greater<int>> heap;
    
    for (int i = 0; i < n; i ++ )
    {
        // 如果当前队列为空,或者当前的所有组的最小的max_r大于等于当前枚举的区间的左端点,说明有交集,则该区间放进新组
        if (heap.empty() || heap.top() >= range[i].l) heap.push(range[i].r);
        // 如果存在一个组的max_r小于当前枚举的区间的左端间,说明该区间可以放进这个组
        // 因为当前枚举的区间的左端点是大于这个组的max_r的,所以更新这个组的max_r的时候,是用这个区间右左端点进行更新
        else
        {
            heap.pop(); // 已经找到更大的max_r,所以原来的max_r没有必要存在了,直接pop
            heap.push(range[i].r); // 用更大的指来更新max_r
        }
    }
    
    // 堆的大小就是我们的组的数量,注意,堆里存的东西是每一个组的max_r
    // 有多少个max_r,堆中就有多少个元素,就说明分成了多少个组
    // 直接将堆的size输出即可
    cout << heap.size() << endl;
    return 0;
}
Code
#include
#include
#include
using namespace std;

const int N = 1e5 + 10;
struct Range{
    int l, r;
}range[N];

bool cmp(struct Range a, struct Range b)
{
    return a.l < b.l;
}

int main()
{
    int n;
    cin >> n;
    
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        cin >> l >> r;
        
        range[i] = {l, r};
    }
    
    sort (range, range + n, cmp);
    
    priority_queue<int, vector<int>, greater<int>> heap;
    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);
        }
    }
    
    cout << heap.size() << endl;
    return 0;
}

你可能感兴趣的:(NYflame的题解,算法,c++,贪心算法)