区间问题(贪心)(二)

简介: AcWing 906. 区间分组

AcWing 906. 区间分组

本题链接:AcWing 906. 区间分组

本博客给出本题截图:


image.png

本题分析

按照左端点从小到大进行排序,如果存在本区间的右端点大于等于下一区间的左端点的话,意思就是两个区间有交集,那么就让答案 + 1,这里,我们用堆来模拟这个过程,堆(优先队列)(STL)见博客:(先鸽),手写堆见博客:(先鸽),我们堆中的元素存的是区间的右端点,这里我们用小根堆,即堆顶元素是右端点的最小值,如果堆为空或者堆顶元素要大于等于下一个区间的左端点,那么就要开一个新的组,把该区间的右端点放入堆中,反之即堆顶元素要小于下一个区间的左端点,那么就意味着,堆顶元素可以和该区间放入一个组中,因为我们要存储每一个组中的右端点的最大值作为该组的右端点,且堆顶元素小于下一区间的左端点,即堆顶元素小于下一区间的右端点,我们要存最大右端点,且这俩区间为一组,就弹出堆顶元素,然后把下一区间的右端点加入堆中.


AC代码

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 100010;
struct St
{
    int l, r;
    bool operator < (const St w) const
    {
        return l < w.l;
    }
}st[N];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        st[i] = {l, r};
    }
    sort(st, st + n);
    priority_queue <int, vector<int>, greater<int>> heap;
    for (int i = 0; i < n; i ++ )
    {
        auto t = st[i];
        if (heap.empty() || heap.top() >= t.l) heap.push(t.r);
        else
        {
            heap.pop();
            heap.push(t.r);
        }
    }
    printf("%d", heap.size());
    return 0;
}

AcWing 907. 区间覆盖

本题链接:AcWing 907. 区间覆盖

本博客给出本题截图:

image.png

本题分析

先按照左端点从小到大进行排序。如何获得本题的最优解:st代表还未更新定线段区间的左端点,我们的核心目的就是在左端点i都小于st的情况下,选择右端点最大的区间

AC代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
struct Range
{
    int l, r;
    bool operator < (const Range w) const
    {
        return l < w.l;
    }
}range[N];
int main()
{
    int st, ed;
    scanf("%d%d", &st, &ed);
    int n;
    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);
    bool success = false;
    int res = 0;
    for (int i = 0; i < n; i ++ )
    {
        int j = i, r = -1e9;
        while (j < n && range[j].l <= st)
        {
            r = max(r, range[j].r);
            j ++;
        }
        res ++;
        if (r < st) break;
        if (r >= ed)
        {
            success = true;
            break;
        }
        st = r;
        i = j - 1;
    }
    if (!success) printf("-1");
    else printf("%d", res);
    return 0;
}

三、时间复杂度

关于贪心——区间选点的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。


目录
相关文章
|
机器学习/深度学习 人工智能 弹性计算
阿里云AI服务器价格表_GPU服务器租赁费用_AI人工智能高性能计算推理
阿里云AI服务器提供多种配置,包括CPU+GPU、CPU+FPGA等组合,支持高性能计算需求。本文整理了阿里云GPU服务器的价格信息,涵盖NVIDIA A10、V100、T4、P4、P100等型号,适合人工智能、机器学习和深度学习等计算密集型任务。具体价格和适用场景详见表格。
643 10
|
机器学习/深度学习 缓存 监控
Redis经典问题:热点key问题
本文介绍了Redis中的热点key问题及其对系统稳定性的影响。作者提出了多种提前发现热点key的方法,包括历史数据分析、业务分析、实时监控、用户行为分析和机器学习预测。同时,文章列举了应对热点key的解决方案,如分布式存储、主从复制、前置缓存、定时刷新、限制逃逸流量和兜底逻辑。通过这些策略,可以有效管理和预防热点key带来的挑战,保证系统性能和可用性。
1805 5
|
4天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1315 4
|
4天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
660 3
|
5天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
11天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
766 6