907. 区间覆盖(贪心)

   分析:先按区间左端点进行排序,然后遍历区间,找一个区间左右端点覆盖起始点,右端点尽量远,直到可以覆盖目标区间右端点

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;
struct Edge{int a, b;} edges[N];
bool operator <(Edge e1, Edge e2) {
    return e1.a < e2.a;
}
int n;

int main() {
    int st, ed;
    scanf("%d%d",&st,&ed);
    scanf("%d",&n);
    for(int i = 0; i < n; i++) {
        int a, b ;
        scanf("%d%d",&a,&b);
        edges[i] = {a,b};
    }
    sort(edges,edges+n);
    int res = 0;
    bool f = false;
    for(int i = 0; i < n; i++) {
        int j = i, r = -2e9;
        while(j < n && edges[j].a <= st) {
            r = max(r,edges[j].b);
            j++;
        }
        if(r < st) {
            res = -1;
            break;
        }
        res ++;
        if(r >= ed) {
            f = true;
            break;
        }
        st = r;
        i = j - 1;
    } 
    if(!f) res = - 1;
    printf("%d
",res);
    return 0;
}
原文地址:https://www.cnblogs.com/yonezu/p/13565416.html