第三十九章 贪心算法——区间问题(下)

news2024/10/9 0:41:05

第三十九章 贪心算法——区间问题(下)

  • 一、区间问题1:最大不相交区间数量
    • 1、思路详解
    • 2、代码实现
  • 二、区间问题2:区间覆盖
    • 1、问题
    • 2、思路
    • 3、代码

一、区间问题1:最大不相交区间数量

在这里插入图片描述

1、思路详解

这道题和前一章讲的最后一道题思路非常的相似,如果大家没看过那篇文章的话,作者建议先去看看那篇:
传送门:贪心算法——区间问题(上)

步骤:

1、将所有区间按左端点从小到大排序
2、从前往后处理每个区间判断能够将其放到某个现有的组中,即判断当前组内最靠左的左端点和前一个组最靠右的右端点之间关系:L[i]和Max_r之间的关系。
(1)如果存在这样的组,即L[i]>Max_r,说明可以把当前的区间放到这个组中,但是由于我们加入了一个新的区间所以要更新一下右端点的最大值。由于我们的L[i]>Max_r,那么加入之后的r[i]一定大于Max_r。所以,这个Max_r删掉即可。
(2)如果不存在这样的组,就让它成为一个新的组。

由于我们判断的是是否存在。因此,我们需要在所有组的Max_r之中选出一个最小值,记作Mr_min。如果L[i]<Mr_min的话,那么必定是不存在的。反之则存在。故我们可以采用小根堆。

2、代码实现

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int n;
vector<pair<int,int>>a;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        a.push_back({l,r});
    }
    sort(a.begin(),a.end());
    priority_queue<int,vector<int>,greater<int>>max_r;
    for(int i=0;i<n;i++)
    {
        if(!max_r.size())
        {
            max_r.push(a[i].second);
            continue;
        }
        if(max_r.top()>=a[i].first)max_r.push(a[i].second);
        else 
        {
            max_r.pop();
            max_r.push(a[i].second);
        }
    }
    cout<<max_r.size()<<endl;
    return 0;
}

二、区间问题2:区间覆盖

1、问题

在这里插入图片描述

2、思路

步骤:
1、按照左端点从小到大排序
2、从前往后依次枚举每一个区间,在所有能覆盖目标区间左端点的区间当中选择一个右端点最大的区间。选完之后,我们的第二次选择为了和上次选择的区间之间不出现断档,那么就必须保证第二个区间的左端点是大于第一次选择的区间的右端点的。后续过程也是一样。

3、代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<pair<int,int>>a;
    int start,end;
    cin>>start>>end;
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        a.push_back({l,r});
    }
    sort(a.begin(),a.end());
    int res=0;
    for(int i=0;i<n;i++)
    {
        int max_r=-2e9;
        int j;
        for( j=i;j<n;j++)
        {
            if(a[j].first<=start)
            {
                max_r=max(a[j].second,max_r);
            }
            else
                break;
        }
        if(max_r==-2e9)
        {
            cout<<-1<<endl;
            return 0;
        }
        start=max_r;
        res++;
        i=j-1;
        if(max_r>=end)
        {
            cout<<res<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA 使用的小技巧

1、调整 idea 的虚拟内存&#xff1a; 尽管本质都是去改变 .vmoptions 配置文件&#xff0c;但推荐使用Change Memory Settings去调整&#xff0c;选择Edit Custom VM Options 或者在本地磁盘目录更改&#xff0c;通过某些方法破解的 idea 很可能造成 idea 打不开的情况 2、显…

【数据结构-源码分析】HashMap源码分析(超级详细)

文章内容1、HashMap简介2、类结构3、属性4、构造方法5、方法5.1、put方法5.2、resize方法6、jdk1.8的优化1、HashMap简介 HashMap基于哈希表的Map接口实现&#xff0c;是以key-value存储形式存在。&#xff08;除了不同步和允许使用 null 之外&#xff0c;HashMap 类与 Hashta…

Oracle数据库同步复制工具Beedup产品功能(二)

接续...... 8、对象比较 Beedup提供主从库相关对象比较功能&#xff0c;比对结果包含各类对象概要统计及差异详情。 支持Oracle、SQL Server、MySQL、DB2 对象比较。 9、 对象恢复 Beedup在向从库写入数据时会禁用目标表的关联触发器&#xff0c;另外对于Oracle 序列的状态…

MySQL复制技术方案——GTID复制配置

在日常运维中&#xff0c;GTID带来的最方便的作用就是搭建和维护主从复制&#xff0c;这也是DBA日常工作中最经常的操作了。GTID的主从模式替代了MySQL前期版本中利用二进制日志文件的名称和日志位置的做法&#xff0c;使用GTID使操作和维护都变得更加简洁和可靠。 搭建主从时…

SQL SELECT 语句

SELECT 语句用于从数据库中选取数据。 SQL SELECT 语句 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 SQL SELECT 语法 SELECT column1, column2, ... FROM table_name; 与 SELECT * FROM table_name; 参数说明&#xff1a; …

SVM训练莺尾花数据集

SVM训练莺尾花数据集 代码在莺尾花数据集上训练SVM&#xff0c;数据集由莺尾花的测量值及其相应的物种标签组成。该模型使用70%数据用于训练&#xff0c;然后剩余部分进行测试。其中′fit′fit′fit′方法在训练集上训练数据&#xff0c;′score′score′score′数据在返回模型…

HTC FOCUS3在PC端串流FOHEART H1数据手套(腕带)

本教程介绍使用FOHEART H1数据手套与HTC腕带式追踪器驱动VR中的虚拟手运动&#xff0c;实现手部的追踪及定位。与之前教程&#xff08;HTC FOCUS 3连接FOHEART H1数据手套&#xff09;不同&#xff0c;这次我们的场景内容运行在PC端&#xff0c;而不是头显端&#xff0c;使用VI…

基于Vue和SpringBoot的电商管理系统的设计与实现

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

8.mysql模块

目录 1 安装mysql模块 2 建立与mysql的连接 3 执行SQL语句 3.1 查询数据 3.2 插入数据 3.2.1 直接写入SQL语句 3.2.2 使用问号进行占位 3.2.3 使用对象传入 3.3 更新数据 3.3.1 使用问号进行占位 3.3.2 使用对象传入 3.4 删除数据 常见的数据库有下面几…

光驱重装系统教程

光驱重装系统是使用最长的系统安装方法&#xff0c;最早时候电脑都有光驱的&#xff0c;很多用户重装电脑系统的时候都会使用光驱重装系统&#xff0c;现在小编来为大家详细的介绍一下光驱重装系统的教程。 工具/原料&#xff1a; 系统版本&#xff1a;win7系统 品牌型号&#…

仪表板工具Stimulsoft Dashboards中的面板组件介绍

Stimulsoft Dashboards.JS是一个功能齐全的仪表盘工具&#xff0c;用于为JavaScript平台创建仪表板。 Stimulsoft Dashboards.JS官方正版下载&#xff08;qun&#xff1a;740060302&#xff09;https://www.evget.com/product/4101/download在上一篇文章中&#xff0c;主要介绍…

剑指 Offer 24. 反转链表

一、题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 二、题目解析&…

AI算法工程师 | 09机器学习-概率图模型(六)命名实体识别与CRF

文章目录机器学习 - 概率图模型 之 命名实体识别与CRF一、命名实体识别 NER 的基本介绍1、相关概念2、主要方法&#xff08;导图&#xff09;3、标注策略二、CRF 层之 BiLSTM&#xff08;BiLSTM-CRF&#xff09;1、介绍1.1 BiLSTM-CRF 模型1.2 添加 CRF 层的好处2、CRF 层2.1 E…

华为云工程师HCIA——华为虚拟化平台使用与管理

一、FusionCompute计算虚拟化介绍 1、计算虚拟化相关概念 1.1、虚拟化介绍虚拟化介绍 1.2、虚拟化的特点&#xff08;反过来考定义也要会&#xff09; •分区&#xff1a;分区意味着虚拟化层为多个虚拟机划分服务器资源的能力&#xff1b;每个虚拟机可以同时运行一个单独的操…

xxx.Caffeine进程缓存

Caffeine 是基于Java 8的高性能&#xff0c;接近最佳的缓存库。看上图 赋代码&#xff1a; <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId> </dependency> package com.heima.item.con…

网络编程 - Linux socket编程

前言 socket(套接字)是网络编程编程的一种技巧。通过socket不仅可以实现跨进程通信&#xff0c;还可以实现跨主机的网络通信。使用这种技术&#xff0c;就可以实现全国各地的通讯。例如&#xff1a;深圳的一台电脑接收来自北京一台电脑发来的信息。   本篇不涉及太底层的网络原…

hudi系列-索引机制

1. 索引机制 hudi的索引机制是为了加速upsert/delete操作&#xff0c;它维护着&#xff08;分区 key&#xff09;-> fileID之间的映射关系&#xff0c;所以可以减少对非必要base文件的合并 key是指索引key&#xff0c;可以是表的任意字段&#xff0c;在全局索引中常用主键…

Linux chmod命令详解,Linux修改文件权限

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 chmod 命令一、常用操作1. 字母形式2. 数字形式3. 递归设置二、文件权限解读三、数字权限四、特殊的root权限五、SUID详解1. 设置SUID2. 取消…

chatgpt小程序版本来了,解决你们手机上想用用不了的问题,chatgpt接口用到小程序里面,调用openai接口,提供前后端源码,可以私有部署使用

现在的chatgpt被玩的都开始加广告&#xff0c;又办会员什么的的&#xff0c;今天就把小程序的前后端无广告版本源码和部署方式说一下。 先看效果&#xff1a; 部署环境 前端用的uniapp&#xff0c;基础模版&#xff0c;单页面没有太多引用 后端使用的python的falsk框架&#…

javassist学习

Java 字节码以二进制的形式存储在 .class 文件中&#xff0c;每一个 .class 文件包含一个 Java 类或接口。Javaassist 就是一个用来 处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法&#xff0c;或者是修改已有的方法&#xff0c;并且不需要对字节码方面有深…