- 博客(35)
- 收藏
- 关注
原创 每日算法:洛谷P10483 小猫爬山(DFS)
每租用一辆缆车,Freda 和 rainbow 就要付 1 美元,所以他们想知道,最少需要付多少美元才能把这 N 只小猫都运送下山?可以看出,如果按照算法,会先加入1994,然后加入1,这样变成1995,而实际情况是如果加入2正好可以变成1996,由此可见贪心在某些状况下会造成浪费,一次我们需要一个一个的试,于是可以很容易想到,应该是dfs。思路:首先有一步贪心思想很容易看出来:我们尽可能将重量大的猫放在前面, 这样后面再尽可能的跟重量小的猫,这样就能最大化的利用缆车。最后能通过一半的测试例。
2025-04-10 21:52:59
311
原创 每日算法:洛谷P9241 [蓝桥杯 2023 省 B] 飞机降落(DFS)
dfs思路:假设当前安排第i架飞机降落,花费时间为time(前一架飞机的落地时间和当前飞机的到达时间取max,因为飞机不能在前一架飞机落地之前就降落),我们每次遍历数组1-n,找出当前放哪一架飞机合法,即当前的飞机油箱要支持它能够等到前一个飞机降落,如果可以则继续dfs,如果最后dfs成功了,则代表合法,反之则代表不合法。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晩可以于 Ti+Di 时刻开始降落。
2025-04-10 18:05:55
408
原创 每日算法:洛谷U535992 J-C 小梦的宝石收集(双指针、二分)
这样,我们假设当l指针在i位置,r指针在j位置时,找到答案,则操作次数为:(i-1)【操作左边要用的次数】+(n-j)【操作右边要用的次数】+min(i-1,n-j)【将左边的值变成最大值或将右边的值变为最小值后,额外再需要移动的次数 例:如果左边是1,右边是8,修改左边后,最后面的两个数应该是8,8因此如果此时要再操作右边,应该额外加上左边的操作次数,同理另一种情况也是如此,而这个值我们希望它尽可能小,这样可操作的次数就会变多】∙ 要么小梦选择一块能量最小的宝石,将他变成一块当前能量最大的宝石。
2025-04-09 21:04:12
946
原创 每日算法:洛谷PP3131(前缀和、同余)
Farmer John 的 N 头奶牛站成一排,这是它们时不时会做的事情。每头奶牛都有一个独特的整数 ID 编号,以便 Farmer John 能够区分它们。6 相关的创伤事件,他只希望拍摄一组奶牛,如果它们的 ID 加起来是 7 的倍数。接下来的 N 行每行包含一头奶牛的整数 ID(所有 ID 都在 0…请输出 ID 之和为 7 的倍数的最大连续奶牛组中的奶牛数量。请帮助 Farmer John 确定他可以拍摄的最大奶牛组的大小。于是我们观察题目:发现题目要求的是取能够被7整除的最大区间和。
2025-04-09 15:28:29
263
原创 每日算法:洛谷P10387(贪心)
我们先统计单独训练的总花费total,如果total比团训s大,则说明团训更划算,进行团训,然后因为我们不确定团训的次数,所以要从小到大去递进,因此要将士兵的训练次数按从小到大进行排序,随后每次计算花费,并更新total,团训次数,以及最小花费。对于第 i 名士兵来说,进行一次训练所需的成本为 pi 枚金币,而要想成为顶尖战士,他至少需要进行 ci 次训练。接下来的 n 行,每行包含两个整数 pi 和 ci,用一个空格分隔,表示第 i 名士兵进行一次训练的金币成本和要成为顶尖战士所需的训练次数。
2025-04-07 17:18:46
376
原创 每日算法:牛客 小红杀怪(贪心,枚举,dp)
思路:很明显可以用贪心思路去写,当群体技能y > x时,我们直接一直用y就行了,否则,先用x将血量大的那个消耗到跟血量少的那个差不多,然后再用群体技能y。随后,我们分别枚举使用了k次y技能后,剩下的血量使用x来攻击,每次取最小值,这样当枚举完所有情况后,我们就能够得到最小的技能使用次数。四个正整数a,b,x,ya,b,x,ya,b,x,y,用空格隔开。
2025-04-07 15:18:39
1238
原创 每日算法:洛谷U535982 J-A 小梦的AB交换
观察:题目的要求是将原字符串不能有连续的A或B,那么最终答案一定是“ABAB.......”或“BABABA..........”的形式,因此我们可以先构造出这两个最终结果的字符串,然后跟原串进行比较,不相同的地方即为要操作的地方,又因为一次操作可以改变两个位置,我们将最后的结果除2,再对两个答案取最小值,就得到我们最终想要的结果啦。小梦有一个长度为 2∗n 的 AB 串 s,即 s 中只包含 "A" 和 "B" 两种字符,且其中恰好有 n 个 "A" 和 n 个 "B"。
2025-04-07 12:13:15
302
原创 每日算法:洛谷P1162(DFS,BFS)
然后,就是典型的BFS模板,遍历上下左右四个位置,如果碰到‘1’就不访问,因为BFS是像水波一样层层遍历,这样在结束的时候,被‘1’围起来的那些‘0’就没有被遍历,因此我们根据标记数组,将没有遍历到且不是‘1’的元素输出为‘2’即可。如果从某个 0 出发,只向上下左右 4 个方向移动且仅经过其他 0 的情况下,无法到达方阵的边界,就认为这个 0。我们从(1,1)处开始输入,然后从(0,0)处开始遍历到(n+1)处,这样是为了确保起点和终点有‘1’的情况。对于 100% 的数据,1≤n≤30。
2025-04-06 17:32:11
274
原创 每日算法:洛谷P2895(搜索BFS)
根据预报,一共有 M 颗流星 (1≤M≤50,000) 会坠落在农场上,其中第 i 颗流星会在时刻 Ti(0≤Ti≤1000)砸在坐标为 (Xi,Yi)(0≤Xi≤300,0≤Yi≤300) 的格子里。流星的力量会将它所在的格子,以及周围 4 个相邻的格子都化为焦土,当然贝茜也无法再在这些格子上行走。贝茜在时刻 0 开始行动,她只能在会在横纵坐标 X,Y≥0 的区域中,平行于坐标轴行动,每 1 个时刻中,她能移动到相邻的(一般是 4 个)格子中的任意一个,当然目标格子要没有被烧焦才行。
2025-03-30 19:52:35
375
原创 每日算法:洛谷P1507(01背包)
所以,在遇到这类航天问题时,也许只能让航天员出仓维修。思路:非常经典的01背包变形题,我们在这里不仅要统计重量,还额外多了个体积,因此是三维数组存储,但是三维数组存储又容易超出内存限制,因此我们需要用滚动数组优化,原理和经典二维01背包数组优化成一维类似,将三维数组优化成二维,然后再带入计算即可。航天飞机的体积有限,当然如果载过重的物品,燃料会浪费很多钱,每件食品都有各自的体积、质量以及所含卡路里。在告诉你体积和质量的最大值的情况下,请输出能达到的食品方案所含卡路里的最大值,当然每个食品只能使用一次。
2025-03-13 10:38:44
302
原创 每日算法:洛谷P1060(动态规划、01背包)
更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N 元钱就行”。从第 2 行到第 m+1 行,第 j 行给出了编号为 j−1 的物品的基本数据,每行有 2 个非负整数 v,p(其中 v 表示该物品的价格 (v≤10000),p 表示该物品的重要度(1≤p≤5)。第一行,为 2 个正整数,用一个空格隔开:n,m(n<30000,m<25)其中 n 表示总钱数,m 为希望购买物品的个数。很好的代码,然后一交,发现过不了,为啥?NOIP 2006 普及组 第二题。
2025-03-11 20:13:07
311
原创 每日算法:洛谷P2758(动态规划)
2.a[i]与b[j]不相等,则需要将a[i]改成a[j],操作次数应该是在原a[i-1],b[j-1]的基础上加上一次操作次数。3.a[i-1]与b[j-1]相等,但是多出来一个b[j],这时需要在a[i-1]的尾部加上一次b[j],操作次数加一。设 A 和 B 是两个字符串。if(a[i] == a[j]) dp[i][j] = dp[i-1][j-1] //不用操作,继承上一次的次数。
2025-03-10 20:20:08
419
原创 每日算法:力扣343.整数差分(动态规划)
那么,从4开始,我们就需要开始差分了,并且,将每次的最大值保存到数组中,那么很显然,如果当前的j*(i-j)不是最大值,难么(i-j)这个数的最大值就被保存在dp[i-j]这个下标的数组中,因此我们可以取j*dp[i-j];然后,取最大值,则有 dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j]));显然,当数比较小时,这样一般是对的,但是当数比较大时呢?分析:根据题目要求,一个数可被差分为它的子数,然后子数乘积中取最大值。则当j <= i 时,有 i = j * (i-j);
2025-03-10 14:21:43
357
原创 每日算法:力扣LCR 095. 最长公共子序列(动态规划)
是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。我们可以构建一个二维数组,分别存储字符串1为i,字符串2为j时,最大公共子序列的长度。我们先假定两个字符串的长度,分别为n和m,当前子串的下标位置分别用i和j来表示。最长公共子序列是 "ace" ,它的长度为 3。最长公共子序列是 "abc" ,它的长度为 3。两个字符串没有公共子序列,返回 0。至此,状态转移方程构建完毕。,返回这两个字符串的最长。那么,如果,两数不相等呢?
2025-03-06 22:01:42
451
原创 每日算法:洛谷B3637(动态规划)
根据题意,我们需要找到最长的序列和,但是这中间可以连续(如124)也可以不连续(如1234),这里我们可以发现朴素算法是每一次都站在一个节点上去一次遍历后面的所有节点,又因为后面遍历的节点的抉择影响着不同的选择,因此我们可以很容易的想象到递归树,众所周知,一旦出现递归树,那么这个问题大概率就可以用动态规划来优化。给出一个由 n(n≤5000) 个不超过 106 的正整数组成的序列。第一行,一个整数 n,表示序列长度。第二行有 n 个整数,表示这个序列。最长上升子序列是指,从原序列中。
2025-03-06 19:21:45
251
原创 每日算法:洛谷P1057(递推、动态规划)
游戏规则是这样的:n 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目。因为每次传球,中间的人只能从左边或右边接受到,于是在表中的表示就是 q[i][j] = q[i-1][j] +q[i-1][j+1])(因为统计的是方案数,所以这里要累加)假设从1开始传球,最后得传回1手上,得计算传了几次球,2008普及组第三题。
2025-03-05 19:59:29
397
原创 每日算法:洛谷P1038(差分、二分)
共有 m 份订单,每份订单用三个正整数描述,分别为 dj,sj,tj,表示某租借者需要从第 sj 天到第 tj 天租借教室(包括第 sj 天和第 tj 天),每天需要租借 dj 个教室。其次,我们发现,当第一个不符合的出现时,那么后面的就都不符合,因此满足二分性,我们用二分算法来遍历。即对于每份订单,我们只需要每天提供 dj 个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。对于 100% 的数据,有 1≤n,m≤106,0≤ri,dj≤109,1≤sj≤tj≤n。
2025-03-04 12:36:27
315
原创 每日算法:洛谷P1006(算法:贪心,模拟)
你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。所有士兵的速度都为 1,但一个士兵某一时刻来到了坐标为 0 或 L+1 的位置,他就离开了独木桥。另外,总部也在安排阻拦敌人的进攻,因此你还需要知道你的部队最多需要多少时间才能全部撤离独木桥。对于 100% 的数据,满足初始时,没有两个士兵同在一个坐标,1≤L≤5×103,0≤N≤5×103,且数据保证 N≤L。1.桥上所有人都是同时移动的,因此不是累加时间和,而是求出所需时间最大的那个人,即为所有人全部下桥的时间。
2025-02-27 16:24:26
395
原创 MySQL基础篇总结
数据定义语言,用来定义数据库对象(数据库、表、字段)。数据控制语言,用来创建数据库用户、控制数据库的控制权限。数据库操作查询所有数据库:查询当前数据库:创建数据库:CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];删除数据库:DROP DATABASE [ IF EXISTS ] 数据库名;使用数据库:USE 数据库名;注意事项。
2024-11-06 20:20:05
843
原创 算法初探:01背包问题
紧接着,现在我们遍历到了三个物品,前面依旧维持上一次的结果,当空间足够放入后,进行判断:当前放入后是否比之前保存的值大,大则更新。(如图中,当为3时,上次的最优解为16,而如果放入,则为12(当前的值加上减去了物品重量后保存的值比如这里,放入后为12+0(减去物品重量3后,0位置上次保存的最优解为0) = 12)因此不更新,维持上次结果。当空间为4时,放入,则为18(12+6),比16大,更新)首先,在01背包中,无非就是两种情况:放或不放,如果放,则背包容量减去物品重量,物品的索引移到下一个位置。
2024-11-06 19:03:45
1073
原创 数据结构:图的最小生成树(Kruskal、Prim算法),最短路径(Dijkstra),拓扑排序,关键路径
⼀个连通图的⽣成树是⼀个极⼩的连通⼦图,它包含图中全部的n个顶点,但只有构成⼀棵树的n-1 条边。连通图和它相对应的⽣成树,可以⽤于解决实际⽣活中的问题:假设A、B、C 和 D 为 4 座城市, 为了⽅便⽣产⽣活,要为这 4 座城市建⽴通信。对于 4 个城市来讲,本着节约经费的原则,只需要建⽴ 3 个通信线路即可,就如图 (b)中的任意⼀种⽅式。在具体选择采⽤(b)中哪⼀种⽅式时,需要综合考虑城市之间间隔的距离,建设通信线路的难度等 各种因素,将这些因素综合起来⽤⼀个数值表示,当作这条线路的权值。
2024-09-26 21:39:47
1227
原创 数据结构:图的概念,图的领接矩阵,领接表,十字链表,邻接多重表,DFS,BFS
首先,我们要明确什么是图,我们在前面知道了树是一种1:n的对应关系,而图则是m:n的关系,即图常用于表示更多复杂的关系,比如在地图中从某点到某点的关系。那么,我们怎么表示图呢?
2024-09-23 19:48:24
991
原创 数据结构:树、二叉树、线索化二叉树、二叉搜索树、AVL树相关知识总结
在⼀棵⼆叉树中,如果所有分⽀结点都存在左⼦树和右⼦树,并且所有叶⼦结点都 在同⼀层上,这样的⼆叉树称为满⼆叉树。⼀棵深度为k且有2^k-1个结点的⼆叉树称为满⼆叉树。( k ≥ 1)。简单来说,就如他的名字一样,所有节点都要“满”,这样的树就是满二叉树。那么,接下来大家看看:这棵树是满二叉树吗:很显然不是,因为7号节点度为0,即叶子节点不在同一层,且节点个数没有达到2^k-1个,也就是我们所说的没有“满”,而这样的二叉树则被我们称之为完全二叉树。
2024-09-04 16:00:19
884
1
原创 C语言基础:一口气搞定所有指针问题!(包含二级指针,指针在数组和函数以及结构体中的相关问题)
,这里我们简单分析一下底层:系统先读到了p,向右看发现有(),升级为函数,同时确定输入和输出类型,随后我们就用大括号进行初始化,此时系统在内存中分配了一块代码空间来用于存放和执行代码,同时又分配了一块数据空间用来存储函数的局部变量,同时又分配了一块代小的空间用来接函数的传入值,同时要注意的是,函数具有只读性,在初始化之后我们后续只能调用函数,而不能对函数进行任何的修改操作。”于是截止,再向左看,发现const,将p变为只读,随后发现*将p升级为指针,再看到int,确定以四个字节进行访问。
2024-04-25 11:37:10
1605
2
原创 Java笔记:stream流
总的来说,stream流是一种对集合或数组进行操作的简化写法,他将原本需要很多行代码的操作简化成一条代码完成,使代码更加简洁。2.shorted():用于给数据排序,注意,只能给基本数据类型默认排序,如果是定义数据类型,则需要在括号中书写排序规则。5.map():对stream流中的数据进行加工之后再返回新的流。括号中填写加工方式。3.limit():取前多少个数据,在括号中写上对应的数字,则就会取到前多少个数据。1.filter():用于过滤数据,在括号中写符合的条件,符合则留下,否则去掉。
2024-04-08 13:53:33
304
1
原创 Java笔记:Map集合
我们可以清晰的看到,HashSet的底层就是一个只要键不要值的HashMap。其实,除了增强for循环,我们还可以使用Map集合自带的一种方法:entrySet,这种方法可以将Map集合中的键值对方法。Map集合是除collection集合外的另一个比较重要的集合,其存储数据的方式为键值对存取。思考:Map集合是无索引的,故不可以用常规的循环遍历,因此我们需要用增强for循环进行遍历。那么,接下来我要告诉你一个炸裂的消息:Set集合的底层其实就是只要键不要值的Map集合!其特点为:无序,不重复,无索引。
2024-04-02 20:53:26
363
1
原创 Java笔记:collection集合-set类集合
无序、无索引的原因:当集合中存入数据时,底层会对数据的哈希值进行求余,求出的值即为数组的下标,然后底层将数据存在数组的这个下标处。不重复的原因:当数据的哈希值重复(哈希碰撞)时,底层将会以链表的形式将新传入的数据挂在老数据下方,同时底层设置了equals方法,当判断存入的数据和之前某个存入的数据相同时,不会存入,故不重复。对,所以设计者也想到了,在JDK8之后,如果数组场长度大于等于64,且某个链表长度大于8时,底层自动将链表转换为红黑树,方便查找。,是模拟出来的地址,不是数据实际存储的物理地址)。
2024-04-02 18:20:43
483
1
原创 Java笔记:Collection集合—list类集合
简单认识了collection集合之后,我们来了解一下他的常用方法(注意:因为collection集合是所有list集合和set集合的祖宗,所以所有的list或set集合都可以使用collection的方法)前面说过,collection集合包含了list集合和set集合,而set集合是没有索引的,这时候用传统的循环很显然就不合适了,于是我们这里就需要用到另一种循环:增强for循环(foreach)迭代器是一种对象,它允许按顺序访问集合中的元素,而不需要知道集合的底层结构。这样看着是不是已经很简洁了?
2024-03-27 21:02:13
352
1
原创 Java笔记:异常
(重点:只能作用在方法上!那么,认识了两种异常后,我们便可以思考:既然我们通常遇到的错误都是Java底层帮我们写好的异常,那么我们可不可以自己来书写一个异常呢,当然可以,我们之前学过了自定义方法,那么,我们也可以自定义异常来提醒使用我们定义的方法的调用者可能出现的异常。这里在写代码时parse方法就会有红线标注提醒,表示这里很容易出错(但也不一定是错误的),比如上面书写的格式就没有错误,我们再三检查后发现没有错误,想继续运行程序的话,则需要用throws关键字将异常抛出,这样程序便可以正常运行了。
2024-03-27 09:37:15
639
原创 算法:二分查找(Java)
二分查找的作用是用于在一段排好序的数组中(注意:一定要是排好序的数组!)通过每次将数据减半的方法,以便更高效的查找到数据。
2024-03-25 20:11:51
164
原创 算法:选择排序(Java)
思考:既然数组存放的数据是按下标来找到的,那么只要先记i的索引值,如果发现比i处大的数据时更新索引值,每一轮结束的时候,如果索引值与i不一样,则更换i处与索引值处的数据,这样,每一轮只要进行一轮交换就可以解决问题,极大节省了性能!但是,这样的代码其实也有一个很大的弊端,就是如果从i处之后的每个数字都比i要大的话,那么最坏的结果就是要交换n - i次,这样极大的浪费了性能,那么有没有什么好的办法可以节省性能呢,当然有!和冒泡排序类,都是将一个乱序数组中的元素按升序或降序的排列方式进行重写排列的一种算法。
2024-03-25 19:14:43
226
原创 经典算法:冒泡排序(Java)
每一轮遍历时,如果前一个数壁后一个大,则将两个数进行交换,这样第一轮遍历完之后,我们就固定好了最大值,因此第二轮遍历时,我们就可以减少一次遍历,同时确定次大的值,以此类推。实现方法:以正序排列为例,先循环遍历,如果数组中的数字比前一个数字小,则进行交换,最后打印输出。冒泡排序的作用主要是用于将一个乱序数组中的数字按从小到大或从大到小的顺序进行排序。不难发现:每次需要遍历的个数为随i的增大而减小,因此排序的总次数应为i-1次。
2024-03-25 17:12:53
241
原创 Java笔记:方法引用
必须要创建类的对象然后再调用类中的方法,随后,为了简化这一繁琐的过程,我们可以直接用匿名内部类直接调用,省去了创建对象的过程,再后来我们学习了lambda表达式,又一次对匿名内部类进行简化。那么,既然有静态方法引用,那么肯定也就有实例方法引用,格式与静态方法引用类似,但值得注意的是,实例方法只能被对象所访问,所以在使用实例方法引用之前,我们要先创建一个对象出来。注意:用方法引用的时候不用带上参数,简单理解:方法引用的格式是 类名::静态方法名,人家要的是方法名,方法名包含参数吗?
2024-03-24 18:54:19
351
1
原创 Java:lambda表达式笔记
匿名内部类常用于子类需要调用父类中的某个方法,但是要求功能不同,这时我们会将父类中的方法定义成抽象方法,同时将父类定义成抽象方法,通过子类对其进行重写,再定义对象去调用,匿名内部类省去了先重写再创建对象再调用的繁琐过程。但是这里有一个问题,就是上面定义的类不满足lambda表达式的前提,即:被简化的匿名内部类必须是函数式接口。可以看出,使用匿名内部类明显方便许多,二lambda表达式则是在匿名内部类的写法上再进一步简化。格式: (被重写方法的形参列表)->{被重写方法的方法体。匿名内部类:new(){
2024-03-24 16:35:21
1177
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人