【算法实战】每日一题: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

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

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

相关文章

【C语言】动态内存管理技术文档

【C语言】动态内存管理技术文档 目录 【C语言】动态内存管理技术文档 一、内存管理基础

java基础篇(1)

JDK是什么?有哪些内容组成?JDK是Java开发工具包 JVM虚拟机: Java程序运行的地方 核心类库: Java已经写好的东西&#xff0c;我们可以直接用开发工具: javac、java、jdb、jhat.. JRE是什么?有哪些内容组成? JRE是Java运行环境 JVM、核心类库、运行工具 JDK&#xff0c;JRE&…

【JavaScript脚本宇宙】融合艺术与科技:揭秘JavaScript绘图与图像处理库

图像处理新视界&#xff1a;六种库重塑你的JavaScript开发体验 前言 在这个科技日新月异的时代&#xff0c;图像处理和绘图库已成为开发者必备的工具。本文将讨论六种高效、强大且易用的JavaScript库&#xff0c;它们可以大大提升我们在处理图像和绘图方面的效率。 欢迎订阅专…

Vulnhub项目:HACKSUDO: THOR

1、靶机地址 hacksudo: Thor ~ VulnHubhacksudo: Thor, made by Vishal Waghmare. Download & walkthrough links are available.https://vulnhub.com/entry/hacksudo-thor,733/ 2、渗透过程 来了来了&#xff0c;开搞&#xff0c;先看目标 56.161&#xff0c;本机 56.1…

WebGL开发电力数字孪生

WebGL 开发电力数字孪生是一项复杂但极具潜力的任务。电力数字孪生通过创建电力系统的虚拟模型&#xff0c;可以实时监控、分析和优化电力系统的运行状态。以下是开发电力数字孪生的详细步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别

目录 一、 动态SQL1.1 \<if>标签1.2 \<trim>标签1.3 \<where>标签1.4 \<set>标签1.5 \<foreach>标签1.6 \<include>标签 二、 #{}与${}的区别2.1 #{}是预编译sql&#xff0c;${}是即时sql2.2 SQL注入2.3 #{}性能高于${}2.4 ${}用于排序功能…

BGP特点

BGP协议本身不产生路由&#xff0c;而是转发本地路由表中来自其他协议生成的路由条目:AS之间正常存在大量的 BGP 邻居关系&#xff0c;且 BGP协议不会计算最佳路径:因此在 BGP协议中管理员需要进行策略来干涉选路&#xff1b; BGP 特点: 1)无类别路径矢量-----距离矢量的升级版…

防雷接地测试方法及注意事项

一、防雷接地的测试方法 检测避雷针、高层建筑物等设施的接地电阻&#xff0c;接雷后能否顺畅导入大地。 1、你先找到防雷接地网的接地引线或等电位联接箱。 2、用接地电阻测测试仪测接地电阻。 &#xff08;有两根测试桩0.4M的要插入泥土&#xff0c;一根距测试点20米&…

基于DeepLabv3+实现图像分割

目录 1. 作者介绍2. DeepLabv3算法2.1 DeepLabv3算法介绍2.2 DeepLabv3模型结构 3. 实验过程基于DeepLabv3实现图像分割3.1 VOC数据集介绍3.2 代码实现3.3 问题分析 4. 参考连接 1. 作者介绍 吴天禧&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究…

[线程与网络] 网络编程与通信原理(五): 深入理解网络层IP协议与数据链路层以太网协议

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

基于java的CRM客户关系管理系统(五)

目录 第五章 系统的详细设计与实现 5.1 持久层设计 5.1.1 创建关系映射 5.1.2 与数据库的连接 5.1.3 Hibernate的ORM映射 5.1.4 Struts的配置文件 5.1.5 Spring 的配置文件 5.1.6 DAO层设计 5.2 逻辑业务层设计 5.2.1 业务逻辑类的实现 前面内容请移步 基于java的C…

基于stm32的双蓝牙主从通信—双蓝牙主从配置、串口配置、串口接收处理浮点数(附测试代码)

前言 此次做的内容是使用 mpu6050 无线控制小车的运动。在做的过程中发现需要用到双蓝牙进行两个板子之间的通信&#xff0c;将主板mpu6050检测的数据传输至从板上从而控制车的移动。 1、配置双蓝牙主从通信 以下是转载博主 不怨天&#xff0c;不尤人 的主从配置方法&#xff…

超市管理系统设计1——基本功能设计

超市管理系统基础功能类设计 1. 概述 本设计文稿提供一个基础的超市管理系统&#xff0c;包含基本的功能设计。该系统将管理商品、顾客、员工和交易记录&#xff0c;不需要接入数据库&#xff0c;通过文件存储数据&#xff0c;并满足面向对象编程的基本要求&#xff08;继承、…

FCCL:Learn from others and Be yourself in Heterogeneous Federated Learning

CVPR2022,通过在公开数据集上的logits相似性(同类相近、异类原理)来迁移客户端知识,通过上轮模型和初始模型延缓遗忘。 论文地址:openaccess code: 作者开源 贡献 提出了一种新颖的联邦学习方法,称为 FCCL(联邦互相关和持续学习)。 为异构联邦学习制定了一种简单有效…

java设置图片透明度

在Java中&#xff0c;你可以使用BufferedImage类来处理图片的透明度。BufferedImage类提供了setRGB方法&#xff0c;你可以通过这个方法设置每个像素的透明度。 以下是一个简单的例子&#xff0c;演示了如何设置图片的全局透明度&#xff1a; import javax.imageio.ImageIO; i…

面试题:说一下 http 报文都有哪些东西?

面试题&#xff1a;说一下 http 报文都有哪些东西&#xff1f; HTTP 是传输超文本&#xff08;实际上除了 HTML&#xff0c;可以传输任何类型的文件&#xff0c;如视频、音频、文本等&#xff09;的协议&#xff0c;是一组用于浏览器-服务器之间数据传输的规则。 HTTP 位于 OS…

IO进程线程(四)文件IO之文件属性、目录操作

一、文件属性信息 &#xff08;一&#xff09;stat函数 1. 定义 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>int stat(const char *pathname, struct stat *statbuf);功能&#xff1a;获取文件的属性信息参数&#xff1a;pathname…

摸鱼大数据——Hive函数14

14、开窗(开列)函数 官网链接&#xff1a;Window Functions - Apache AsterixDB - Apache Software Foundation 14.1 基础使用 开窗函数格式: 开窗函数 over(partition by 分组字段名 [order by 排序字段名 asc|desc] [rows between 开窗开始 and 开窗结束]) ​ partition b…

【问题随记】System policy prevents Wi-Fi scans,解决连接 WIFI 需要权限的问题

问题随记 System policy prevents Wi-Fi scans&#xff0c;每次打开我的开发板连接 wifi 都会出现下面的弹窗&#xff0c;这也阻挡了我的WIFI自动连接&#xff0c;然后就需要连上屏幕&#xff0c;输入 wifi 密码&#xff0c;这样才能进行 VNC、SSH 等一系列的连接。 问题解决 …

【运维项目经历|026】Redis智能集群构建与性能优化工程

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…