最大不相交区间数量(贪心)

题目:最大不相交区间数量(贪心)

题意:

给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。

输出可选取区间的最大数量。

输入格式

第一行包含整数 N,表示区间数。

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

输出格式

输出一个整数,表示可选取区间的最大数量。

数据范围

1≤N≤1e5,
−1e9≤ai≤bi≤1e9

输入样例:

3

-1 1

2 4

3 5

输出样例:

2

样例解释:选择区间[-1, 1], [2, 4],答案为2。

题目分析:贪心。

解题步骤:

  1. 将所有区间按右端点从小到大排序。
  2. 从头到尾枚举每一个区间。

(1) 若该区间与前面选择的区间有交集,则跳过。

(2) 若该区间与前面选择的区间没有交集,则选择该区间,此时答案 + 1。

贪心策略证明:

  1. 设贪心得出的答案是cnt,本题的正确答案是ans。
  2. 由于本题的答案ans是所有方案的最小值,所以必有ans <= cnt。
  3. 设在正确答案中有些区间不是第一个与前面选择的区间没有交集的区间,由于区间是按右端点从小到大排序的,所以选择第一个与前面选择的区间没有交集的区间(即右端点最小的区间)能够减少与后面的区间相交的可能,所以将正确答案中不是第一个与前面选择的区间没有交集的区间替换成第一个与前面选择的区间没有交集的区间是更优的,所以有cnt <= ans。
  4. 由于ans <= cntcnt <= ans,得cnt = ans。

AC代码:

#include<iostream>

#include<algorithm>

 

using namespace std;

const int N = 1e5 + 10;

struct st{

    int x, y;

    bool operator < (const st &X) const{

        return y < X.y;

    }

}a[N];

int n;

 

void solve(){

    scanf("%d", &n);

    for(int i = 1;i <= n;i++) scanf("%d %d", &a[i], &a[i].y);

    sort(a + 1, a + 1 + n);

    

    int res = 0, t = -2e9;

    for(int i = 1;i <= n;i++){

        if(a[i].x > t){

            res++;

            t = a[i].y;

        }

    }

    printf("%d\n", res);

}

 

int main(){

    solve();

    

    return 0;

}

时间复杂度:O(nlogn)。

空间复杂度:O(n)。

posted @   思丶君  阅读(360)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示