【算法实战】每日一题:17.1 订单处理问题(差分思想,二分搜索)
题目
一个会议中心的场地预订系统。在接下来的 n 天里,会议中心有一定数量的会议室可供租用。共有 m 份预订请求,每份请求描述为 (d_i, a_i, b_i),表示需要从第 a_i 天到第 b_i 天使用会议室(包括第 a_i 天和第 b_i 天),每天需要使用 d_i 个会议室。预订按照提交时间顺序处理,如果某个请求的需求超出了会议中心剩余的会议室数量,那么需要暂停处理流程,通知当前申请者调整他们的请求。工作人员需要知道是否所有的请求都能被完全满足,如果不能,还需要知道需要调整的是哪一份请求。
初步代码
def process_orders(n, m, room_availability, orders):# 创建一个变量的副本。available_rooms = room_availability.copy()for order in orders:# 这里的话就是根据我当前拿到的订单,然后去。房间里面对应的去查看。d, start_day, end_day = orderfor day in range(start_day, end_day + 1):# 这里的话就是我当前的订单是。是不是可以剩余啊?如果说这里是。我当前的房间数量不能满足你的订单数啊那我就return一个负一。 # 那么我这里根据要求第一个行返回一个负一啊。第二行我返回当前的一个索引啊,也就是,呃,我当前是因为拿到了一行嘛,我当前拿到的是一行我当前拿到的一行的话,orders去调用这个index的方法。那就是看我当前的这个东西在你这里面的索引是多少啊?又因为Python是从零开始的,所以得加一。if available_rooms[day] < d:return -1, orders.index(order) + 1# 那么如果说我当前的房间是满足你的这个订单的话,那么我就减等于一啊,然后不断地过去。available_rooms[day] -= dreturn 0 if __name__ == "__main__":# n表示总共N个天数,总共有三个订单。n, m = map(int, input().split())# 这里输入每天房间可以用的情况。room_availability = list(map(int, input().split()))orders = []for _ in range(m):orders.append(list(map(int, input().split())))# 然后这边返回以后的话我们再对结果进行判断啊。这里是按照他的要求,如果是零的话返回给零,如果有不满足订单返回一个复议以及索引。 result, order_to_modify = process_orders(n, m, room_availability, orders)if result == 0:print(0)else:print(-1)print(order_to_modify)
很显然,这样的思路有很大的优化的空间。这里我们只是单纯地对每一步进行操作。那么换1种思路。比如使用差分数组的方法,可以优化代码
// 这个函数实际上处理的是传入的这个NUM5之前的。进行检查。
bool check(int num){// 这里设置为零,就是单纯做一个初始化,然后下面用差分数组的方法啊,给它每一个区域的订单数都会拉伸或者啊做拉伸起来。for (int i=1;i<=num;i++){sub[s[i]] +=d[i];sub[t[i]+1]-=d[i];}// 然后这样的话,我们就得到了一个。一维的数组,里面存储着。订单的。每一天的订单的数量。for (int i=1;i<=n;i++){// 然后这里注意,因为这里是对区间进行处理,然后每一个订单里面它都是几天到几天啊,它需要增加多少订单数啊,所以它很明显就是天然就是一个差分数组的形式啊。假如说没有订单的话,那每天都是需求数都是零。啊,但是这里的话给了每天的订单,那么这里就直接使用差分数组的方式来进行处理。这里的// 这里的查封的意思实际上可以理解为前一天河道后一天的需求X啊,如果说订单是零的话,那么需求差就是全部是零啊,也就是上面这里写的这个啊,刚开始初始化的时候都设置为零,然后开始往里面加订单啊,哪一天到哪一天里面啊,需要增加多少的数量啊,所以很明显就天然。是一个查封数组的形式,然后上面由于我们这里是,呃,天然是一个茶壶数组的形式,那么我们使用查封数组拉伸区间的方法去对它进行相加。然后这里的话我们就需要得到他的原始的数据啊。如果说。我的需求数啊,是大于。我目前拥有的这个房间的数量那么很满,很显然就是满足条件了啊我就把return true。// 这里还有一点注意的就是它实际上是从一开始的。所以啊,这里就考虑到初始化的问题啊,我就不用初始化了然后每次第一列都是默认是零,然后我从一开始。need[i] = need[i-1] + sub[i];if (need[i]>r[i])return true;}return false;
}//主函数二分搜索// 那么如果说有一些订单是无法满足的。那么我为了提高效率啊,我就可以啊。每次只进行1/2的查找啊,就是找到这个最关键的时间点。呃,换句话说,这里实际上是找到那个问题,订单啊,最快的方法,那么我们可以很简单地用一个二分查找方。while (le<=ri){mid = le + (ri-le)/2;// 这里就是如果我发现了在左半部分是这个问题点,那么我就去左半部分找,否则的话我就去用半部分找。// ans的作用是记录当前,找到最大的订单数。// 这里特别要注意啊,就是二分查找它的前提必须是输入的数据是有序的,才能用二分查找这里因为提供给的他的数据都是有序的,所以我们可以直接用。if(check(mid)){ri = mid-1;// 并且由于是有序的,那么我在左半部分,它的最大值就是 中间最中间的那个。// 这里注意啊,为什么左半边有需要去Kan S复制啊?右半部分没有啊,首先这里的mid就是索引,我们看到上面Le和ri,呃,是一和M,这里是长度。那么这里给他整除了以后就是它中间的那个数啊,也就是表示的是索引,然后因为我们是从前往后逐个的去找。啊,这么那么在进行二分查找的过程中我们想过啊,如果是我们在左半部分找到了啊。那我们就压缩这个空间啊啊按从右往左,然后逐个的去压缩空间啊。如果说你在右边找到呢,那其实也一样啊,右边找到了以后,你到最后肯定是,呃,把这个空间给逐步缩小的。// 这里的文化an S放在这里,主要是从逻辑上来讲啊,因为我们的check函数是啊,以当前位置为准,然后向前去找这个问题点啊,如果说。呃,这个check函数它是为true的话,那么表示问题点在当前的维乾,那么就是以made made以前啊,那么made也是1种可能,并且是1种最大的可能性啊。所以说这里主要是因为逻辑原因啊,并不是别的什么原因。ans = mid; }else{le = mid+1; }
上面的代码为截取最关键的一部分分析,代码思路来源于bilbli轩哥码题,注释为随笔,只说明大概思路,
这里的订单处理问题很显然天然的用到了差分的思想。
N = 10**6def check(num, n, r, d, s, t):sub = [0] * (N + 1)for i in range(1, num + 1):sub[s[i]] += d[i]sub[t[i] + 1] -= d[i]need = [0] * (N + 1)for i in range(1, n + 1):need[i] = need[i - 1] + sub[i]if need[i] > r[i]:return Truereturn Falsedef main():n, m = map(int, input().split())r = [0] * (N + 1)d = [0] * (N + 1)s = [0] * (N + 1)t = [0] * (N + 1)temp_r = list(map(int, input().split()))for i in range(1, n + 1):r[i] = temp_r[i - 1]for i in range(m): temp = list(map(int, input().split()))d[i], s[i], t[i] = temple, ri = 1, mif not check(m, n, r, d, s, t):print(0)returnwhile le <= ri:mid = le + (ri - le) // 2if check(mid, n, r, d, s, t):ri = mid - 1ans = midelse:le = mid + 1print("-1")print(ans)if __name__ == "__main__":main()
END
相关文章:
【算法实战】每日一题:17.1 订单处理问题(差分思想,二分搜索)
题目 一个会议中心的场地预订系统。在接下来的 n 天里,会议中心有一定数量的会议室可供租用。共有 m 份预订请求,每份请求描述为 (d_i, a_i, b_i),表示需要从第 a_i 天到第 b_i 天使用会议室(包括第 a_i 天和第 b_i 天࿰…...

UML静态图-对象图
概述 静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段,帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构,包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。 对象图与类图之间的关系&…...

数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】 链表链表的实现链表OJ习题顺序表和链表的区别和联系 本文章主要讲解关于链表的相关知识,喜欢的可以三连喔 😀😃😄😄😊😊🙃&#…...

RabbitMQ-发布/订阅模式
RabbitMQ-默认读、写方式介绍 RabbitMQ-直连交换机(direct)使用方法 目录 1、发布/订阅模式介绍 2、交换机(exchange) 3、fanout交换机的使用方式 3.1 声明交换机 3.2 发送消息到交换机 3.2 扇形交换机发送消息代码 3.2 声明队列,用于接收消息 3.3 binding …...

客运提质增效新模式!苏州金龙客货邮融合公交闪耀2024道路运输展
5月31日,“2024北京国际商用车及零部件展览会”暨“2024北京国际道路客货运输车辆及零部件展览会”(简称为“2024道路运输车辆展”)在中国国际展览中心(顺义馆)落下帷幕。本届展会以“智能、绿色、安全,助力…...

【Python实战】使用postman测试flask api接口
cookie_demo.py # -*- coding: utf-8 -*- """ Time : 2024/5/28 17:14 Author : 娜年花开 File : cookie_demo.py Desc : 需求:用户需要先登陆,登陆之后,通过Cookie来判断是不是能够访问登录后的接口userinfo &quo…...

Docker大学生看了都会系列(二、Mac通过Homebrew安装Docker)
系列文章目录 第一章 Docker介绍 第二章 Mac通过Homebrew安装Docker 文章目录 前言Mac通过Homebrew安装本机环境系统要求terminal命令安装查看安装信息配置阿里云镜像加速登陆阿里云配置加速地址其他国内加速地址 总结 前言 在上一章了解了Docker容器是什么之后,本…...

探索 Android Studio 中的 Gemini:加速 Android 开发的新助力
探索 Android Studio 中的 Gemini:加速 Android 开发的新助力 在 Gemini 时代的下一篇章中,Gemini融入了更多产品中,Android Studio 正在使用 Gemini 1.0 Pro 模型,使 Android 开发变得更快、更简单。 Studio Bot 现已更名为 And…...
linux运维——查看网卡实时流量脚本
方法一 以使用iftop命令来查看Linux系统中网卡的实时流量。如果您的系统还没有安装iftop,可以通过包管理器进行安装。 对于基于centos,可以使用以下命令安装: sudo yum install iftop 安装完成后,运行iftop命令查看实时流量&a…...

【三维重建NeRF(三)】Mip-NeRF论文解读
本文结合深蓝学院课程学习和本人的理解,欢迎交流指正 文章目录 Mip-NeRF流程简述混叠问题与MipMapMip-NeRF提出的解决办法圆锥台近似计算与集成位置编码(IPE) Mip-NeRF流程简述 Mip-NeRF的大体流程和NeRF基本是一样的,NeRF介绍 创新的部分就是针对NeRF…...

安卓SystemServer进程详解
目录 一、概述二、源码分析2.1 SystemServer fork流程分析2.1.1 [ZygoteInit.java] main()2.1.2 [ZygoteInit.java] forkSystemServer()2.1.3 [Zygote.java] forkSystemServer()2.1.4 [com_android_internal_os_Zygote.cpp]2.1.5 [com_android_internal_os_Zygote.cpp] ForkCom…...

Android studio 连接 adb传输文件到电脑
前提是已经连接到adb window R: 打开控制台adb devices:可以查看已经连接的设备adb pull /storage/emulated/0/Download/aa.png C:\Users\Administrator\Desktop:拉取连接设备的文件 aa.png 到电脑桌面上 (在电脑控制台进行拉取操作) 如果…...
Web学习篇(二)
命令执行漏洞 一、常用的函数 1、eval() 例: eval(string $code) 把字符串code作为PHP代码执行 2、assert() assert( mixed $assertion [, string $description ]) 检查一个断言是否为 FALSE,如果 assertion 是字符串,它将会被 assert()当做 PHP 代码来执行。 3、p…...
在Linux/Ubuntu/Debian系统中使用 `tar` 压缩文件
在Linux/Ubuntu/Debian系统中使用 tar 压缩文件 tar 命令是用于在类 Unix 操作系统中创建文件和目录存档的强大实用程序。 基本存档创建 要创建文件夹的简单存档,请使用以下命令: tar -cf ./my-archive.tar ./my-folder/此命令将创建一个名为 my-arc…...

Idea-Linux远程开发部署
第一步:File->Remote Development 第二步: 第三步: 第四步:在Host位置填写Linux虚拟机的IP地址,在Username、Password填写对应的账号密码后点击Test Connection测试连接。 第五步: 第六步:在…...

智能硬件会是下一个风口行业吗?
“风口行业”一直是人们热捧的择业目标,曾经红极一时房地产行业,此时已成沉舟侧畔之势,也意味着一个又一个行业时代的更迭。 随着5G时代的到来,“智能化”成了人们热议的话题,因为大家都懂:顺势而为才是王…...
mysql like 查询优化
1.如果我们查询的时候用like 模糊查询%a%,数据量大了会查询全局,效率很低 SELECT * FROM Customers WHERE CustomerName LIKE %a%; 优化: 不会破坏索引 -步骤-:创建适合Like查询的索引ALTER TABLE users ADD INDEX idx_username (usernam…...

3389连接器,3389连接器如何进行安全设置
在计算机网络领域,3389端口作为Windows系统默认的远程桌面协议(RDP)端口,在远程办公、技术支持等场景中发挥着重要作用。然而,由于其广泛的使用和直接暴露在互联网上的特性,3389端口也极易成为黑客攻击的目…...
代码随想录训练营Day56:Leetcode647、516
Leetcode647: 问题描述: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例 1: 输入:s &q…...

LLM主要类别架构
LLM主要类别架构介绍 LLM主要类别 LLM本身基于transformer架构。自2017年,attention is all you need诞生起,transformer模型为不同领域的模型提供了灵感和启发。基于原始的Transformer框架,衍生出了一系列模型,一些模型仅仅使用e…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...