- 博客(117)
- 收藏
- 关注
原创 蓝桥杯2024B组
二分查找:通常用于在有序集合中快速查找到目标值。但当问题满足以下条件时,也可以使用二分查找来解决最优化问题:解的范围明确且有序:需要确定解的可能范围,且该范围具有单调性。例如,当某个候选值满足条件时,更大(或更小)的值也一定满足条件。存在高效的验证方法:能够快速判断某个候选值是否满足问题的条件。
2025-03-22 17:09:50
271
原创 1313:【例3.5】位数问题--细节递推
N 表示位数,o[i] 表示到第 i 位包含偶数个 3 的数字数量,j[i] 表示到第 i 位包含奇数个 3 的数字数量。当 i==N 的时候,由于首位不能为零(1,2,4……偶数个3时,只要下一位不再是3就仍然为偶数。(注意当N>1时,最高位不能为0)
2025-03-17 11:45:49
259
原创 1196:踩方格--递推优化(二维数组的拆解)
本质:通过将二维坐标隐含在方向选择中,避免了显式坐标跟踪,使一维优化成为可能。并非所有的二维动态规划问题都能直接改为一维数组优化,是否可行取决于。是不是所有的二维数组移动的题目,都能优化为一维的呢?状态分解:将移动方向(左、右、上)作为独立状态。(如l[i]依赖u[i-1]和l[i-1])。递推问题,我们都需要先从最简单的入手。:初始化(得先有才能推)转移规则:每个方向的状态。将二维数组优化为一维。
2025-03-17 11:11:36
131
原创 1314:【例3.6】过河卒(Noip2002)--DP>DFS【超时DFS】
中等规模数据(如n+m≤30):需结合记忆化搜索(Memoization)。本题数据范围(n,m≤20):必须使用DP或记忆化搜索。小规模数据(如n+m≤15):DFS可以接受。
2025-03-15 19:29:38
175
原创 1191:流感传染--BFS
在同一天对一个病原体进行处理时,如果直接更改数组,将直接影响到后续的遍历。,遍历完所有坐标后,在统一更改感染。那么我们可以定义一个数组用来。
2025-03-15 18:48:50
266
原创 【递推】1188:菲波那契数列(2)&【进阶】1189:Pell数列&【进进阶】1190:上台阶--优化斐波那契【不开long long JZZ】
n%m,所有我们可以在计算的过程中对其存储的值进行取模。由题可知最后需要输出的是对1000取模的结果,优化1:记忆化存储,可以避免重复计算。
2025-03-15 17:25:45
140
原创 1176:谁考了第k名&1180:分数线划定--sort()与结构体的配合(精准排序)
妙手:定义结构体-sort()自定义比较函数【使其根据学生成绩降序排列】,实现进准排序。
2025-03-15 10:27:00
205
原创 1140:验证子串--next.data()、KMP和find
KMP中需要注意的是:应该从下标1开始遍历,因为下标0前面无值,不能匹配next。next.data()是std::vector容器的一个成员函数,它的作用是。对于字符串的匹配常见的KMP算法【面试常考】固在循环外应初始next[0]=0;便于使用的find代码也在下面了。交不了了,明天再试试。
2025-03-14 18:43:56
266
原创 2050:【例5.20】字串包含--巧解循环移位【自我拼接】
假设原字符串是 “ABCD”,将其拼接两次得到 “ABCDABCD”。此时所有可能的循环移位结果都会作为子串出现在其中因此,只需要检查 s2 是否是拼接后的字符串的子串,就能判断是否存在某种移位使得 s2 包含在其中。如果没找到:返回 string::npos(一个特殊常量,表示“未找到”)例如,big_str 中 “CDA” 起始于位置 2(索引从0开始)。如果找到:返回子串第一次出现的起始位置(索引值)find():用于在一个字符串中。,实现所有可能的移位结果。
2025-03-14 16:07:11
146
原创 2048:【例5.18】串排序--注意begin和end的使用【数组的排序】
STL 容器类对象(如 vector、string、set 等)进行排序:sort(s.begin(),s.end())既然说到了排序,那么直接就想到了sort()函数。
2025-03-14 14:51:30
156
原创 2047:【例5.16】过滤空格、2050:【例5.20】字串包含--快慢指针【覆盖】
代码中用的快慢指针,遍历快指针(i),只要不是空格就赋值给慢指针,遇到空格就停止,直到找到下一个单词,先手动添加空格再slow++。还有更加取巧的方法【利用到了cin遇到空格就输入停止的特性】因为对s修改后,s的长度会发生变换固需用到。重复上述步骤直至遍历结束。
2025-03-14 14:28:21
270
原创 2046:【例5.15】替换字母--getline、取地址
getline(cin, s):用于读取包含空格的。,直到遇到换行符(即按下回车键时输入的字符)。单词或字符(遇到空格停止)。才能正确处理原文中的空格!cin >> a:用于。
2025-03-14 14:06:11
247
原创 1120:同行列对角线的格--主副对角线规律
主对角线:i - j = x - y(同一对角线的点行差列差相等)副对角线:i + j = x + y(同一对角线的点行列和相等)
2025-03-14 11:34:22
161
原创 1128:图像模糊处理--注意强转问题、round()四舍五入
round 函数是 C++ 中用于对。替代写法(手动实现四舍五入)进行四舍五入的数学函数。
2025-03-14 11:14:42
150
原创 1126:矩阵转置
错误原因:这一步的双重循环,我直接复制上面的(tmd习惯了,没多想)测试案例太阴险了,给个行列一样的。这种题,拿着想都不想直接开写。然后一提交【未通过🤡】
2025-03-14 10:37:47
131
原创 1218:取石子游戏--DFS
2.不能一次取完,遍历我们所有能取的方案,再递归调用dfs 判断该方案下对手能否取完,若不能返回false,则我们赢【因为这个游戏不会出现平局情况,谁能取到最后一步谁赢,我们若能判断该方案下,对手不能赢,那么我们必赢】代码中的for循环正是枚举所有可能的操作,寻找让对手必败的操作。如果找到,立即返回true(当前玩家赢);当前玩家能赢的条件:存在至少一种操作,使得对手在剩下的局面中无法赢。当前玩家输的条件:所有可能的操作都导致对手能赢。这个dfs 方法还是挺难想到的。很牛的代码,值得好好分析。
2025-03-14 10:23:36
219
原创 1221:分成互质组--【超绝】质数合并
这就要引入数学知识了,互为质数的俩人gcd(a,b)==1,而且若gcd(a*b,c)==1,那么他仨都互为质数。当然可以直接使用__gcd(),但是有些地方可能要求你不能用的【比如面试- -】题目要求的分组,不是俩俩一组,而是一组可包含多个数,并且满足俩俩互为质数。不会有人一来,看见合并数组,就直接双重循环开始遍历了吧?找到互为质数的就标记,continue,cnt++吧?这个代码能够完全满足需求,太TMD牛逼了!
2025-03-12 19:09:06
212
原创 1222:放苹果--最巧妙的DFS
实不相瞒这个代码我看了2个来小时,以为我一直习惯不写DFS中的return,导致越看越迷糊。return 一定得写!直接判断盘子,十分复杂,我们可根据剩余的苹果数量判断。排列问题【无重复】,直接DFS秒了!代码解决这个问题非常的巧妙QAQ。2.允许空盘 p_q。
2025-03-12 18:22:39
536
原创 1199:全排列--DFS
3.可能需要“撤销选择,尝试其他路径”【例如:尝试一个字母后发现后面走不通,要回退】1.需要遍历所有可能性【例如:生成所有排列、找出所有解法】2.答案有“树状结构”或“层层递进”的特点。【例如:走迷宫时每一步的选择像树枝分叉】如何判断是否用DFS?全排列问题,是典型的DFS题目。2.是否走错一步就要回头。
2025-03-12 14:55:31
149
原创 1253:抓住那头牛--BFS
我第一眼看见,以为是递归的楼梯问题,但是楼梯问题中的每一步选择是固定的,比如每次只能走一步或两步,而这里的情况更复杂,特别是跳跃到两倍的位置(),再加上还能往回走,就会形成更多的分支,递归的话重复计算太多,效率可能不行。while循环判结构体队列是否为空,定义零时结构体=结构体队列的头元素。而BFS可以一层一层地搜索,找到第一个到达目标点的路径,就是最短的。然后就还是递归模板,用队列<结构体>定义结构体队列,传初值,标记起点。这种最短路径问题,还得是递归!【递归其实与暴力无异】。移动–判定–传新值–标记。
2025-03-12 09:50:17
273
原创 P9242 [蓝桥杯 2023 省 B] 接龙数列--DP【巧妙解决接龙问题】
例如斐波那契数列:fib(n) = fib(n-1) + fib(n-2),计算 fib(5) 需要重复计算 fib(3)。例如本题中,以数字 y 结尾的最长接龙序列长度,只依赖于前面以 x 结尾的序列长度。动态规划(DP)是一种解决复杂问题的算法思想,它的核心是。DP 能保证全局最优,但可能需要更高时间复杂度。,最后再用N-dp中的最大值,得到最少删除数。3.子问题的最优解能推导出全局最优解(当前状态的值只依赖于前面已计算的状态。,并记录中间结果避免重复计算。子问题之间有重复计算的部分。
2025-03-10 17:50:02
706
原创 P8630 [蓝桥杯 2015 国 B] 密文搜索--map、substr
题意:密码是给出字符串S的乱序,我们需要找到有哪几个位置能够匹配密码,返回能在S中的匹配次数。最后我们遍历S,一次截取8个长度,然后加上相应键的值,因为不是密码的值为0=没加。于是我们得引入字典:map【让唯一的密码做:键,让出现次数作为值】因为只要字符的数量相同,那么密码就一定是S中的乱序。这里我们可以看作哈希,但是密码是字符串,常规数组显然不能满足。,所以我们在存入map时先利用sort进行排序,然后值++。
2025-03-10 11:33:14
419
原创 P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 or Set--lower_bound()的解法!!!
首先先让所有的f(i)=i,即每个人最开始的祖先都是自己,然后就每一次都让轮到那个数的父亲+1,第二次出现的时候就直接用父亲替换掉。1.快速合并与查询:需要频繁合并集合(如标记某个数已被占用)和查询根节点(找下一个可用位置)。3.动态维护连续区间:每个数字的父节点指向下一个可用位置,天然维护了一个动态递增的区间。2.路径压缩优化:通过压缩查找路径,使得后续查询接近常数时间复杂度。
2025-03-09 16:50:51
290
原创 P8685 [蓝桥杯 2019 省 A] 外卖店优先级--优先队列“数组”!!!!!
/ 单个队列i < 3;cin >> x;h.push(x);// 所有元素插入同一个队列while (!// 按小顶堆顺序输出:1 2 3h.pop();return 0;
2025-03-09 11:36:50
555
原创 P9421 [蓝桥杯 2023 国 B] 班级活动--数学题(配对问题)
题目中说到最少,那我们肯定选更改一次的。那我们优先选次数大于2的和次数为1的值进行配对,如果次数为1的值用完那就只能用情况2了将剩余的次数*2。题目中的配对问题,要求配对的成功的数字不重复,那么我们需要把多余2次的数记录下来,我们巧妙的运用到了哈希方法。这里巧妙的运用到哈希用res记录了大于2的次数一共有多少。3.让次数大于2的值和次数为1的值配对,也只需更改一次。1.如果配对次数为1的值,我们只需要更改一次。2.如果配对次数大于2的值,我们需要更改两次。
2025-03-09 10:52:18
175
原创 P8641 [蓝桥杯 2016 国 C] 赢球票--环形结构问题
给定一个顺序的排列,可按一定顺序数数,若数数与排列的值相同可取走,去走后,从下一个重新数数,求不同的数数顺序的最大值。想的就是暴力解答,遍历从每一个数字开始数的情况,求最大值。
2025-03-08 16:29:37
371
原创 P8723 [蓝桥杯 2020 省 AB3] 乘法表--进制转换【辗转相除法】
进制乘法表,就是比普通的乘法表多一个进制转换的过程,我们求出普通的进制乘法表,再转换一下进制就OK了。但是有坑【蓝桥杯就喜欢挖坑:D】,他乘法表的因数也要进制转换一下【很容易忽略】,不是只对结果进制转换。这里的进制转换方法,我用到的辗转相除法,
2025-03-08 15:24:36
585
原创 P8781 [蓝桥杯 2022 省 B] 修剪灌木
没错没错,就是你刚剪完他这个情况下,下一次他就达到最大高度,那么就算他距离边界的最大值*2【往返】求每棵树最多能张多高,那就得想什么情况下,这颗树能张到最大高度。
2025-03-08 14:50:30
341
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人