区间问题(贪心)(二)

简介: 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;
}

三、时间复杂度

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


目录
相关文章
|
10月前
|
机器学习/深度学习 人工智能 弹性计算
阿里云AI服务器价格表_GPU服务器租赁费用_AI人工智能高性能计算推理
阿里云AI服务器提供多种配置,包括CPU+GPU、CPU+FPGA等组合,支持高性能计算需求。本文整理了阿里云GPU服务器的价格信息,涵盖NVIDIA A10、V100、T4、P4、P100等型号,适合人工智能、机器学习和深度学习等计算密集型任务。具体价格和适用场景详见表格。
492 10
|
机器学习/深度学习 缓存 监控
Redis经典问题:热点key问题
本文介绍了Redis中的热点key问题及其对系统稳定性的影响。作者提出了多种提前发现热点key的方法,包括历史数据分析、业务分析、实时监控、用户行为分析和机器学习预测。同时,文章列举了应对热点key的解决方案,如分布式存储、主从复制、前置缓存、定时刷新、限制逃逸流量和兜底逻辑。通过这些策略,可以有效管理和预防热点key带来的挑战,保证系统性能和可用性。
1642 5
|
4天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
328 102
|
4天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
|
5天前
|
缓存 JavaScript 前端开发
JavaScript 的三种引入方法详解
在网页开发中,JavaScript 可通过内联、内部脚本和外部脚本三种方式引入 HTML 文件,各具适用场景。本文详解其用法并附完整示例代码,帮助开发者根据项目需求选择合适的方式,提升代码维护性与开发效率。
197 110
|
5天前
|
Android开发 开发者 Windows
这是我设计的一种不关机,然后改造操作系统的软件设计思路2.0版本
本文介绍了在不重启系统的情况下实现操作系统改造的两种方案。第一种方案通过SLFM Recovery模式,在独立于操作系统的最高权限环境下完成系统更新与改造,并支持断电恢复与失败回滚。第二种方案采用多分区机制,通过SLFM套件在独立分区中完成系统改造,适用于可中断与不可中断服务场景,确保系统更新过程的安全与稳定。
230 132