自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(228)
  • 收藏
  • 关注

原创 算法题(180):发射站

本题关键是找到所有信号站的左右两侧离他最近的比他高的信号站,然后将这些可以接受的信号值累加起来,得到sum后筛出最大值即可。然后由这个塔去接收信号值,累加进入sum中。1.左侧离他最近的高于他的塔。2.右侧离他最近的高于他的塔。

2025-07-25 19:16:33 243

原创 算法题(179):单调栈

说明当前索引位置不存在左侧大于他的数,且当前栈顶数据也不会成为后续的其他数据的要求数(假设其可以成为后续数据的要求数,那么当前遍历到的数据会比他更符合要求,故不可能)他们和情况1与2最大的区别就是搜索范围,变为了右侧,所以我们逆着搜索,也就是从右往左搜索。我们只需要改变一个地方,将情况1代码中的小于等于换成大于等于,大于换成小于即可。单调栈中的数据始终保持单调递增或单调递减。

2025-07-24 21:45:43 410

原创 算法题(178):填涂颜色

2.正常来说我们需要将边缘一圈遍历一遍把所有边缘0作为起点进行dfs,但是这样要有四次for循环,所以我们从(1,1)作为输入原点,从而让整个图表的外圈多了一圈0,我们直接从(0,0)开始搜索就可以达到同一个目的(将联通0找出来)正常来说我们需要遍历图表,然后对所有0进行dfs搜索,最终在遍历过程中将被1包围的0修改为2,不过可能会出现其中一侧已经被修改为2,但是另一侧发现会和边界联通,从而导致错误修改。所以我们正难则反,将所有联通0找到,并修改bool数组标记所有联通0,最后再遍历图表分类输出即可。

2025-07-22 17:15:58 287

原创 算法题(177):水填充

我们只需要遍历一次整个地图,找到一个没记录过的区块点就让ret++,然后用bfs将该区块的所有点都标记为已遍历过即可。1.由于需要记录遍历状态,所以我们需要使用bool数组,false表示没有遍历过,true表示遍历过。2.由于是八连通,所以我们的dx和dy数组就要多弄四组出来。本题需要我们找到联通(八连通)的w区块数,并输出。

2025-07-21 18:08:55 226

原创 算法题(176):three states

2.对于统计点为荒地的时候由于该地会被铺设三次,所以我们需要减2,统计国家地块的时候我们就直接加就行了,因为国家地块是不会进行铺设的,所以不存在重复铺设的情况。这种方法需要考虑的前提很多,我们的国家不一定是连在一起的,可能都分开,可能其中两个国家连起来,有可能都是直接连起来的,所以不太好写代码。由于铺设的时候遇到荒地可以铺设,遇到国家的时候不用铺设,所以对于铺设数的权值就是0和1.我们就可以采用01bfs了。只需从某个点出发然后搜索到三个国家即可,最后对比所有距离中最小的。

2025-07-20 21:19:04 372

原创 算法题(175):小明的游戏

由于本题的目的是找最短路径,所以我们可以采用bfs来进行搜索,而路径权值并非都为1,而是有0有1.故我们采用01BFS。能成功的本质:权值为1,dis数组的值都是非递减的,所以每一个位置第一次到达的距离一定是到他的最短距离。路径权值为1或0,需要对数据顺序进行排序,还要进行松弛操作将最优距离计入。本题需要我们找到从起点到终点所需的最短距离并输出(多组输入输出)路径权值都为1,直接按轮次搜索即可。

2025-07-19 22:40:50 207

原创 算法题(174):刺杀大使

题目要求我们需要将第n行的m个房间的机关都打开,就是说我们的部队需要进入到每一个房间,而我们是可以上下左右自由移动的,所以只要能进入第n行的任意一个房间即可。假设我们有一个满足题目要求的答案ret,那么比ret伤害值大的路径一定存在,而比ret伤害值小的路径一定不存在。因为二分查找可以将区间范围内所有的数涵盖到,而答案一定存在于二分区间中,所以经过bfs判断的结果一定是存在的。由于题目中需要找的是部队整体伤害值最小的路径中最大伤害值,符合“最小值最大”模板,我们尝试使用二分答案。

2025-07-17 16:23:23 264

原创 算法题(174):全排列问题

我们都是依次放入前面没放过的数据,唯一的区别在于最终的输出格式,题目要求场宽为5,所以我们不能再使用cout来输出,而是使用printf结合%5d来完成输出。本题需要我们找出1~n选n个数的全排列情况,并按照五个场宽的要求输出。其实我们本题的思路和上一题的思路是几乎一致的。

2025-07-13 19:57:20 128

原创 算法题(173):枚举排列

由于最后还需要我们按照字典序输出,且无法事先确定需要的for循环层数,所以我们这里不能采用简单的for循环解决。1.使用bool数组来判断对应数据是否选取过,为false就是没选过,true就是选过。在选取的时候我们依次选取前面没有选过的数插入即可,最后选取满k就输出答案。2.在选择完成和回溯的时候要注意将数据选取状态调整回来。本题需要我们找出所有排列方式并按照字典序排序输出。

2025-07-12 18:07:26 238

原创 算法题(172):组合型枚举

1.使用vector进行数据记录的好处:不用在dfs中传递待插入位置的索引,可以直接使用push_back()接口进行数据插入,使用pop_back()接口进行数据弹出回溯。本题需要我们对1到n的数进行n中取m的组合枚举,找到所有不同的组合并按照字典序输出,要求行内和行间都满足字典序。1.我们需要从前面填写过的数的下一个数开始填写,且这个数的填写顺序是字典序从小到大。其一是无法确定for循环个数,因为我们要取m次,而m是题目给的,我们事先无法知道。对于已经选了1的第二个空位我们可以填写:2,3,4。

2025-07-10 22:38:19 365

原创 算法题(171):枚举子集

如图所示我们可以看到决策树的决策逻辑,进入决策前需要提供当前决策层数,进入决策后我们则需要先给N,再给Y,从而最终可以按照字典序输出(先用N的话优先完成排列的就是含有N在前面多的)。由于本题的可选择字符只有两个,所以本题使用二进制枚举也是可以的,但是这里我们还是使用更通用的递归方法。本题需要我们根据正整数n,实现对字符串的全排列枚举。

2025-06-30 09:28:46 205

原创 算法题(170):地毯填补问题

此时我们其实可以将矩阵分为四部分,每部分都是k为1的情况的矩阵,对于包含公主的那一部分我们可以直接利用上情况1的方法,对于其他三部分我们则可以铺设一块恰好包含这三部分的地毯,从而让其他三部分都有障碍物,进而可以完全利用k=1的解决方法解决k=2的问题。我们不要一上来就直接分析最难的情况,我们先分析k为1的情况。一共有四种情况,我们只需要选择不包含障碍物的地毯即可。本题需要我们找出地毯的铺设方式并将铺设方式打印出来。k为1也就是长度为2^1的情况,此时矩阵为2*2。

2025-06-15 20:27:29 185

原创 算法题(169):最大子段和(分治思想)

我们可以把给定区间平均分成两部分,然后获取左段区间的最大子段和,右段区间的最大子段和,以及跨区间的最大子段和。最后比较出他们三种情况的最大子段和并返回。对于获取左右两段区间的最大子段和,我们可以直接递归调用dfs进行,对于最后一种情况则需要直接处理。本题需要我们找到区间的最大子段和并输出结果。

2025-06-14 18:33:28 329

原创 算法题(168):逆序对

此时cur2所指向的数据和cur1所指向的数据可以组成逆序对,且由于cur1后面的数据也是大于cur1所指向的数据的,所以cur2指向的数据也可以和剩下的左段区间cur1后面的所有数据组成逆序对。由于两段区间都是升序排序的,此时说明cur1所指向的数据不可能组成逆序对,直接cur1++其中查找左段和右段的逆序对数可以直接调用自身进行递归处理,因为他们是同样处理方法的问题。根据逆序对的定义,只要是满足索引和数值呈负相关的两个数,他们就是一个逆序对。也就是说索引小的数值却比索引大的数值更大,此时就是逆序对。

2025-06-13 18:13:35 353

原创 算法题(167):FBI树

而由于题目要求按后序遍历输出,所以我们就按照后续遍历的方式进行递归调用。这种情况只剩当前的字符没有输出,我们直接输出当前字符并返回即可。1.我们使用前缀和算法快速的求出对应字符串的sum,前缀和数组存储的是每一个字符的前缀和的值。假设字符串的每一个索引位置的值相加之和等于字符串长度,说明字符串都为1,此时为字符'I'。假设字符串的每一个索引位置的值相加之和为0,说明字符串都为0,此时为字符'B'。本题需要我们将字符串按照题目要求进行递归展开,并按照后序遍历的顺序输出。首先我们需要模拟一下题目的意思。

2025-06-11 23:23:55 277

原创 算法题(166):占卜DIY

本题其实就是一个模拟题,但是如果我们按照题意对扑克堆进行操作,就相当于对数组进行数据头插与尾删了,而我们需要进行的次数是较多的,这样会导致效率低下,且模拟也不是很好进行。这里我们第一行的扑克牌中四张都没有翻出来过,所以我们需要移动第四张牌,此时我们直接定位到下标为四的牌就是下一个需要移动的牌。3.最终cnt中若没有未翻转的牌,说明该牌堆含有一对,即cnt[i]值为0时说明第i行含有一对,answer++我们发现每次的操作都是一样的,且在抽取到K之前都是逐层进行的,所以我们可以用递归模拟抽牌和放牌的过程。

2025-06-10 22:15:42 347

原创 算法题(165):汉诺塔问题

递归就是大问题的解决要依靠一模一样的小问题,此时我们就可以通过自己调用自己函数的方式来解决此类问题。n为3的情况,我们先将前面两个盘子移动到三号柱子上,然后再将三号盘子移动到二号柱子上。n为2的情况,我们先将第一个盘子移动到三号柱子上,然后再将二号盘子移动到二号柱子上。所以大问题就可以分解为同样的子问题,都是将x柱子上的盘子通过y柱子移动到z柱子上。第二步:将x柱子上的最后一个盘子借助y柱子移动到z柱子上。第三步:将y柱子上的n-1个盘子借助x柱子移动到z柱子上。

2025-06-08 21:37:30 298

原创 算法题(164):贴海报

我们可以直接模拟贴海报的过程,创建一个墙数组,每次贴海报就把对应位置的数组值改为海报编号,最后统计出的整个数组中海报的编号个数就是能看到的海报张数,直接输出即可。我们看到图示情况下,直接将数据录入disc数组可能会出现离散后统计结果与实际不同的情况,这是因为离散化后让区间缩短,如果不手动插入区间会导致离散区间异常重合。时间复杂度:我们需要进行m次贴海报,海报的数据范围是1e7,m的数据范围是1e3,乘起来会超时。由于本题的海报数据范围较大,但是海报张数的数据范围却较小,满足离散化使用前提。

2025-06-07 21:35:09 383

原创 算法题(162):火烧赤壁

一段区间是左闭右开的,所以着火区域是用右端点减去左端点。为了防止区间重叠导致的重复计算,我们需要使用差分的思想来解决问题,差分数组中每当有着火区域就让他索引位置+1,让末端位置-1。还原差分后最终的值不为0就是着火区域。1.由于我们后面需要用到去重之后的离散化数组,所以在升序排序之后我们仍然需要对disc去重。2.哈希表是根据实际值查找离散值,disc数组是用离散值查找实际值。哈希表用在差分数组部分,因为要对对应离散值位置进行着火判断。disc用于映射找回实际着火区间,累加到answer中。

2025-06-05 23:34:34 296

原创 算法题(161):序列求和

6的乘法逆元求法:根据费马小定理,6和1e9+7互质,且1e9+7是质数,所以6的乘法逆元就是6的p-2次方(不用算出结果,在计算的时候就可以取余p了,因为要处处取模)。于是我们使用快速幂来进行计算。但是由于本题的n的数据范围极大,所以我们首先在定义的时候要用longlong,然后用6的乘法逆元与其他数相乘来代替除6这个操作。注意:我们每进行一次乘法都要取模一次p,因为他们的值很大,不处处取模会导致数据溢出。本题需要我们计算出S(n)取模1e9+7的结果并输出。我们高中学过S(n)的公式:S(n) =

2025-06-04 21:29:00 140

原创 离散化思想

1.unique可以对指定迭代器区间进行去重,并返回去重后的迭代器区间末尾迭代器,所以我们用unique可以完成去重,用他的返回值减去disc+1(区间开始位置迭代器)得到去重后的数据个数。,如果我们要用数据值来映射数组下标,此时数据范围大不好直接映射,我们可以先将数据映射为一个较小的值,然后我们再用离散化后的数据处理问题。此时不能直接根据x的值映射到数组中,因为x的值太大了,数组要开这么多空间是不允许的。1.哈希表的key是数据值,value是离散化后的数据值。

2025-06-04 21:06:19 531

原创 算法题(160):64位整数除法

这里要不要加当前的倍增结果就可以通过看b的二进制表示对应位数来确定了。且计算倍增结果和添加到answer的时候都进行取余,可以保证不溢出。如果对应位数为1说明要加,否则则不需要。

2025-06-03 16:54:10 245

原创 算法题(159):快速幂

由于a-b关于c取余了,所以结果的绝对值一定小于c,此时我们加c就会让中括号内的数据值大于0,这就是补正,然后我们再取余c即可。然后将他根据二进制的含义拆解为2的n次幂的式子,此时我们就可以利用上我们倍增计算出来的数据表示出任意次方的a的值了。我们可以通过每次倍增a的n次方来快速得到a的2的n次幂的结果,而不需要一个个a乘,大大减少了a的次方的计算时间。空间上:由于a和b的最大值都是2^31,所以最终的结果也是大于longlong类型的,会溢出结果。时间上:会进行2^31次,他的数量级非常大,一定会超时。

2025-05-30 18:57:40 438

原创 算法题(158):牛栏预定

1.由于我们最后是要根据奶牛的编号顺序依次输出该编号奶牛所使用的牛棚编号,所以记录奶牛挤奶区间的节点需要有起始时间,结束时间和奶牛初始编号。2.建立小根堆可以通过重载<运算符来实现,我们将<运算符的逻辑反过来,原本要放前面的数据放在后面。4.对于可以使用旧牛棚的情况,我们需要把旧牛棚的节点从小根堆中移除,然后进行完操作之后再将新的节点插入堆中。本题需要我们安排奶牛的挤奶牛棚,使得每天每头奶牛都可以挤过奶,要求牛棚使用数量尽可能少。而对于负责记录牛棚使用情况的小根堆,则需要知道结束时间和牛棚编号。

2025-05-29 21:53:35 313

原创 算法题(157):奶牛防晒

3.在给奶牛选防晒霜的时候,防晒值小于左端点,说明这头牛不可能享受阳光了(后面的防晒霜防晒值更低)。对于区间问题我们需要先对区间排序,而此题又涉及防晒霜的放置,所以我们也需要对防晒值进行排序。这些情况之外的就是防晒霜匹配成功,我们让answer++,并让cnt--,退出当前牛的匹配。所以我们的目的就是合理的分配防晒霜,使得尽可能多的奶牛可以得到合适的防晒霜享受阳光。我们先把较小的a给了第一个区间,第二个区间就无法接受较大的b了,方案错误。把较大的b给了第一个区间,第二个区间就无法接受小的a了,方案错误。

2025-05-27 17:35:53 439

原创 Linux:基础指令与内涵理解(下)与权限

Y:表示年 %m:表示月 %d:表示日 %H:表示时 %M:表示分 %S:表示秒。

2025-05-27 11:15:50 1302

原创 算法题(156):雷达探测

左端点升序排完后,能重叠的区间都是连续排列的,我们先以a[1].r作为第一个基准点,遇到新区间的left小于等于r,说明有重叠,此时让r = min(r,right),因为我们要保留的是右端点更小的区间,这样才能让所有区间都有重叠。若left大于r,没重叠,说明要放新的雷达,answer++,然后r = right。本题的题目背景是二维的,我们直接对二维的题目进行思考根本没有思路,而因为雷达只能放在海岸线上,这是一维的放置方式,所以我们尝试降维思考。,所以left = x-l,right = x+l。

2025-05-26 21:02:27 469

原创 算法题(155):线段覆盖

我们先尝试左端点升序排序,此时区间1为【0,2】,区间2为【1,3】,区间3为【2,4】。我们看到区间1和2是互相覆盖的,此时我们舍弃掉区间隔2,保留区间1(因为保留右端点更小的区间有更大可能不与后面的区间覆盖,从而得到更多的不覆盖区间)。然后再用区间1和区间3进行比较,发现他们不是互相覆盖,所以answer++,遍历结束,结束搜索。2.answer初始化为1:因为不管什么情况,只要有区间,一定会有一个区间是可以单独选出来而不覆盖的(只有一个区间不存在覆盖的问题)具体可以采用哪种预处理排序方法取决于题意。

2025-05-25 17:35:49 337

原创 算法中的数学:费马小定理

定义:如果两个整数a,b模p的余数相同,那么a,b就是模p的同余式。

2025-05-24 21:10:56 458

原创 算法题(154):合并果子

本题没有需要改动的地方,和模板题哈夫曼编码基本一致,所以不做详细讲解。,且他消耗的体力是移动果子的重量之和,消耗的体力值需要最小。由于题目中说多多最终需要把很多堆的果子移动为一堆。本题需要我们找到多多消耗的最小体力值。

2025-05-24 20:30:37 245

原创 算法题(153):哈夫曼编码

从树的根到树的其中一个叶子结点的路径长度与该叶子结点权值的乘积为该叶子结点的带权路径长度。一棵树的所有叶子结点的带权路径长度之和就是树的带权路径长度对于权值为1的叶子结点来说:他的带权路径长度就是根节点到他的距离(2)X自己的权值(1),得到结果为2对于整棵树来说:带权路径长度就是所有的叶子结点的带权路径长度之和在含有n个带权叶子结点的二叉树中,树的带权路径长度最小的二叉树就是哈夫曼树,也叫最优二叉树我们将所有的带权叶子结点分别当成一颗颗树,那么所有叶子结点就组成了一片森林。

2025-05-22 19:16:25 639

原创 算法题(152):奶牛玩杂技

且我们发现假设我们确定了所有牛的排序,然后取出相邻的两个奶牛,交换他们的顺序并不会影响除了他们以外的其他奶牛的压扁指数,故我们可以通过交换排序推出排序规则。2.最终遍历的顺序:由于我们奶牛是第一头放在最上面的,所以我们正着遍历,然后由于总压扁指数指的是被压的最扁的那头牛,所以我们用max维护。只要最大的压扁指数较小,那么就说明这个情况是我们需要的,也就是说若i前j后,就需要i前j后的最大压扁指数比i后j前的最大压扁指数更小。本题需要我们找到最佳的奶牛排序方式,使得我们的总压扁指数可以最小。

2025-05-21 17:24:21 264

原创 算法中的数学:欧拉函数

a与b的最大公约数为1在1~n中,与n互质的数的个数就是欧拉函数的值eg:n=1时,欧拉函数的值为1,因为1和1是互质的n=2是,值为2,因为1和2都是互质的f(1)= 1且f(xy) = f(x)f(y),其中x与y互质。

2025-05-21 11:04:14 1188

原创 算法题(151):保卫花园

2.计算最终吃草总数的时候,我们维护一个前段耗时T0,每次遍历到接下来要牵的牛我们就先用T0乘单位吃草数来累加到sum上,然后更新T0即可。2.若这两个元素交换顺序后对前面确定好的数据不产生影响,对后面的数据也不产生影响,此时我们就可以通过交换前后的结果判断交换规则。对于拍完顺序的后段:能影响后段的只有前面总耗时,但是交换i和j的顺序并不会改变总耗时,所以对后段也没有影响。本题需要我们安排好牵牛顺序,达到被吃掉的花数量最少得目的,并且我们需要求出一共被吃掉的花的数量。1.首先我们消去相同的D1,D2。

2025-05-20 16:51:56 395

原创 算法题(150):拼数

如果按照字典序直接排,那么此时会拼接位25257,而实际上我们可以拼接出更大的数据35735,所以直接将数据的字典序进行比较是错误的。判断解析:我们先用+进行字符串连接,然后根据字典序进行判断大小(其实就是整形数据的判断方法,都是从最高位开始判断大小)本题需要我们将数组中的数据经过排序,使得他们拼接后得到的数是所有拼接方案中最大的。这里我们的比较逻辑是a+b > b+a就让a放前面,和前面分析的一样。如果我们直接按照数组数据的字典序进行排序,会导致部分情况出错。我们可以按照拼接后的数据的字典序进行判断。

2025-05-19 21:16:47 296

原创 算法题(149):矩阵消除游戏

不过其实我们完全一开始可以直接就选择第一行和第三行,这样子两个回合就拿到了所有权值,所以这个策略是有问题的。1.calcnt的作用是找到二进制枚举方案中对行进行了几次选取,也就是求出i的二进制表示中有多少个1。2.cmp是传递给sort的仿函数,用于将排序变为降序。本题需要我们找到消除矩阵行与列后可以获得的最大权值。此时我们会先选择第一列,然后更新各行列的总和。此时我们就再选择第三行,选择结束。

2025-05-18 20:20:43 553

原创 算法题(148):排座椅

由于题目会告诉我们有哪几对的同学会交头接耳,所以我们可以记录下第几行/第几列上可以隔开的同学对数,而题目限制我们的行隔离只有k行,列隔离只有l行,所以我们只要求出同学对数最多的前k行与前l列即可。然后由于最后输出的时候要按照行号/列号小的排前面输出,所以我们再对排序后的前k行的行号进行排序,列也是同理。若x==p,同学在同一行,此时我们需要用列来隔离,所以对min(y,q)的列count++若y==q,同学在同一列,此时我们需要用行来隔离,所以对min(x,q)的行count++

2025-05-17 12:54:40 277

原创 算法题(147):纪念品分组

由于我们在放置礼物的时候需要让每一组的礼物价值都不超过w,且要尽可能的分更少组数,所以我们不会对价值最少的两件礼物分在一组,因为这样可能会导致分的组数变多。因为a[n]<a[right],而a[right] + a[m] <= w,所以a[n]+a[m]<=w是合法的。可以调整为a[left]+a[right] <= w 与 a[n]+a[m] <= w。我们把小的礼物放一起,大的礼物就只能分别单独放,此时分的组是三组。本题需要我们找出能使分组最少的纪念品分组组数。eg:四个礼物,两个大礼物,两个小礼物。

2025-05-15 18:07:19 300

原创 算法题(146):最大子段和

我们可以使用双层for循环,第一层循环负责遍历每一个数组元素,然后分别以他们为子段起点,第二层循环从第一层循环的索引开始接着往下遍历累加结果到sum中,且遍历的时候不断用max方法让sum与answer进行比对,如果出现sum小于0就停止当前子段和的搜索,因为。而ac段的总和不会小于0,因为如果他小于0(也就是此时sum就小于0了),那么就不会存在Sab段,直接在Sac段就截断了。其实我们不需要进行两层for循环,一旦出现sum小于0,说明前面一段的所有元素都不可能是最大子段和的开头索引。

2025-05-14 22:33:10 338

原创 算法题(145):货仓选址

这个公式的意思是数轴上的a,b两点分别和数轴上任意一点之间的距离之和不小于a,b之间的距离,即一点x到a,b两点的距离之和在x位于a,b之间时最短。所以只要货仓位于所有商店组(以1号商店与n号商店为第一组,依次从前面和后面选商店组队)中间,就可以达到目的。当商店为偶数个:我们将货仓选在中间靠左边或靠右边的商店位置都可以,为了与奇数个求法对齐,我们选择靠左边的。因为每家商店都需要接收一车商品,所以这里的距离之和指的是从货仓到每一家商店的路线的距离之和。数学公式:|a-x| + |b-x| >= |a-b|

2025-05-12 22:56:57 376

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除