蓝桥杯 4262. 空调 知识点:差分

4262. 空调 - AcWing题库

解析:开学季优惠来啦 | 每日一题 | AcWing 4262. 空调_哔哩哔哩_bilibili

首先题目的意思给我们两个数组,p,t,让我们对t数组进行区间+1,-1的操作使其变为P数组:

我们可以转化一下,也就是把0数组进行加区间1减1操作后变为D数组,D序列是P数组和t数组的差值数组:

求出来了怎么由0序列变为D序列所需的操作数也就求出来了由t序列变为P序列所需的操作数。

本题一定有解,因为题目说了最小可以对一个数进行加减,大不了我们一个一个加减,总可以把t数组变为P数组:

那么我们对区间进行加1减1的操作就可以用差分。差分可以把整个区间加减上某个数的操作转化为对两个数进行加减的操作。

因此我们就需要求一下D数组的差分D',同时我们也需要将0数组变为差分数组0':

原来我们由0数组变为D数组需要对某个区间进行加减操作,但是进行求导变差分数组之后我们只用对0'数组上的某两个点进行加减操作就可以把0'数组变为D'数组:

假设我们对0数组【L,R】区间进行加1,那么对差分数组0'来看就是L这个点加1,R+1这个点减1:

同理,假设我们对0数组【L,R】区间进行减1操作,那么对差分数组0'来看就是L这个点减1,R+1这个点加1:

假设我们原始0数组长度为【1~n】 那么因为差分0'数组要取区间到R+1,所以长度就为【1~n+1】

举个例子:

由0'数组变为D'数组和由D'数组变为0'数组是一样的:

我们先对-1,3进行+1,-1操作,变为:

再对2,-2进行-1,+1操作,变为:

再对1,-1进行-1,+1操作,变为:

此时,经过3次操作就完成了由0'数组变为D'数组。

题目给我们任意一个数组,问我们经过多少次操作可以把0'变为D'。

首先我们来确定下下界。

D数组里面的正数和假如是S,那么负数和也一定是-S,为什么呢?

差分数组公式:

B1=D1

B2=D2-D1

Bn=Dn-Dn-1

Bn+1=Dn+1-Dn

因为Dn+1是0,所以 Bn+1=-Dn.

最后结果就是0,所以正数和一定等于负数和的相反数。

ok,我们对正数进行-1操作,那么经过S次操作,所以的正数都全部变为0了,因此我们的答案一定是>=S的。

相关推荐
泥泞开出花朵15 分钟前
LRU缓存淘汰算法的详细介绍与具体实现
java·数据结构·后端·算法·缓存
ankleless34 分钟前
C语言(02)——标准库函数大全(持续更新)
c语言·开发语言·算法·标准库函数·零基础自学
补三补四1 小时前
Shapley与SHAP
大数据·人工智能·算法·机器学习·数据分析
KarrySmile1 小时前
Day17--二叉树--654. 最大二叉树,617. 合并二叉树,700. 二叉搜索树中的搜索,98. 验证二叉搜索树
数据结构·算法·二叉树·二叉搜索树·合并二叉树·最大二叉树·验证二叉搜索树
凤年徐1 小时前
【数据结构与算法】21.合并两个有序链表(LeetCode)
c语言·数据结构·c++·笔记·算法·链表
程序员老冯头2 小时前
第三十二节 MATLAB函数
数据结构·算法·matlab
lifallen2 小时前
hadoop.yarn 带时间的LRU 延迟删除
java·大数据·数据结构·hadoop·分布式·算法
淮北4945 小时前
STL学习(十一、常用的算数算法和集合算法)
c++·vscode·学习·算法
糖葫芦君5 小时前
玻尔兹曼分布与玻尔兹曼探索
人工智能·算法·机器学习
花火|11 小时前
算法训练营day37 动态规划⑤ 完全背包 518. 零钱兑换 II、 377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)
算法·动态规划