
笔试强训
文章平均质量分 72
强训锻炼算法
阿^觅
这个作者很懒,什么都没留下…
展开
-
C++笔试强训day1
2.然后set2遍历第二个数组,如果set2中已有该元素,则跳过,若没有,先存储元素到set2中,接着判断第二个数组中的元素在set1中是否存在,存在则直接存入ret(需要返回的数组)这道理可以直接理解为消消乐,利用栈的特性,从字符串头开始遍历,一个一个进栈,若发现s[i] = st.top(),就删除栈顶,并且遍历下一个数。到最后将栈里面的数一个一个取出+=到ret(需要返回的字符串)中,最后reverse(逆置)就行。(当然,用insert也可以,不过需要加if判断,别让哈希存储相同元素)原创 2024-04-18 14:16:02 · 757 阅读 · 0 评论 -
C++笔试强训day2
我当时的想法非常单一,就是想着用两个数组将s1和s2在vector<string>中的位置储存起来,然后遍历两个数组,求其相减的最小值,可能由于n只到了1e5,就全案例通过了。注意:该题的目的地是下表位n的位置,而不是n-1。1.分析几维(当然也能直接创建多个数组分开分析)2.优化(预处理思想 这里也可以看做dp吧)看题目就清楚了,一眼dp(动态规划)。数组中两个字符串的最小距离。单纯分类讨论,不加赘述。1.自己思路(能跑过)原创 2024-04-18 18:37:11 · 556 阅读 · 0 评论 -
C++笔试强训day3
我的思路超级简单,就是将输入的每个string存入vector,然后遍历每个string的第一个元素,如果为小写字母,就-32存入,若为大写,则直接存入。我一开始的想法是暴力枚举,然后再用滑动窗口优化暴力,将每个符合条件的l和r下标存入一个tmp结构体中,最后遍历这个结构体完成解题。看到题目描述中最小的和,那就是每次都找最大的偶数除以2。时间都差不多,毕竟都是一个算法,但内存大大优化了。这时就很容易想到优先队列(也就是堆)。就是这段代码我唯一不理解的是。堆创建时默认为大根堆。原创 2024-04-19 23:51:31 · 504 阅读 · 0 评论 -
C++笔试强训day4
分析很容易得到dp[i]与dp[i - 1]的关系为dp[i] = dp[i - 1] + m。因为you和oo里面都有o,但是you可以得两分,所以贪心策略尽可能的去凑更多的you,剩下的o则是n - 1分。我一开始分析这道题目的时候,想到的竟然是DFS遍历,压根做不出来,因为做不到多源搜索。因为只有一维,而且状态转移方程只涉及一个数,也可以不创建dp表,用一个变量来表示。就是只需要寻找 dp[n] 和 dp[n - 1] 的映射关系就好了。减一是因为我写的是从1开始的,而题目是从0开始。原创 2024-04-22 13:03:20 · 603 阅读 · 1 评论 -
C++笔试强训day5
最后别忘记将ret逆置一下,因为是从尾开始存入的。注意:最后的结果是倒过来的,所以需要写逆置再返回。这道题要处理的细节还是蛮多的,要多加分析特殊情况。因为要模拟加法运算,链表又是单向的,所以。实际上就是模拟乘法运算。根据上述分析可以得到,其。就可得结果(返回时记得。原创 2024-04-22 21:43:49 · 731 阅读 · 0 评论 -
C++笔试强训day6
很简单的思路,直接一边建立斐波那契数列,一边判断是否已经小于这个斐波那契数,直接break中断循环,然后判断其离前后距离那个更近(也就是去min)。注意:最后如果搜索到底没结果,记得将vis回溯,就一开始遍历过的数调回没遍历过。判断好返回条件就很简单了,就当pos遍历到最后一个数时,就可以返回true了。解析题目本意就是找到离斐波那契数最近的那个输入数的距离。大体一看就可以知道是一道DFS(深度优先遍历)题。注意:最后打印记得左靠齐五格就行。原创 2024-04-23 09:21:45 · 385 阅读 · 0 评论 -
C++笔试强训day7
因为我见了很多DFS的题目返回值都为bool,因此我认为DFS必须以bool作返回值,结果导致浪费很多时间还得不到成果。然后我写代码的时候代码思路没跟上原本思路,直接把所有的l,r,len都存起来,然后最后再遍历一遍存起来的数。回想起才发现思路清晰了,但是代码写的一塌糊涂,其实可以直接在遍历的过程中不断更新l,r,len就可以了。我没有经过思考,所有就把所有情况都遍历了,真的很傻的行为,虽然过了,但是很繁琐嘞,太多情况了。因为是排序过后的,所以只需要遍历包含第一个数在内的四种情况即可。原创 2024-04-26 11:16:02 · 549 阅读 · 0 评论 -
C++笔试强训day8
于是我就想到了可以先去排序,然后采用类似滑动窗口的思想去遍历所有长度,边遍历边更新len。我看到这个方格子直接就想去DFS了,简直无语了。DFS半天,给自己都DFS懵逼了。最大公约数求法:辗转相除法(或者可以用<numeric>头文件中的gcd)最大公倍数 = A * B / A 与 B之间的最大公约数。而且是很基本的动态规划,只比斐波那契难一点点。其实这题正解是dp(动态规划)从一开始存入图,方便初始化。这就是一道普通的数学题。数组中的最⻓连续⼦序列。因为题目要求值连续,原创 2024-04-27 20:49:05 · 793 阅读 · 0 评论 -
C++笔试强训day9
day9的题目都比较简单,就不赘述了。原创 2024-04-27 21:12:38 · 460 阅读 · 0 评论 -
C++笔试强训day10
一开始没认真看题目,直到提交了好几遍没过还是没去检查题目,一直检查代码逻辑,哎呦,难受了。我的一开始的解法是用队列存储一个pair<int, int>一个存值,一个存下标。细节:不确定是不是两数连一起相同,比如ababa 和 abaabc。双指针往该数的两边同时走,然后一直更新len就好了。然后暴力枚举每个组合,最后肯定是超时了。处理好这些细节之后,解题就不容易出错。我以为是收尾字母相同就行了。一道线性加约束条件dp问题。这样就能保证另一种也能过。买卖股票的最好时机(一)原创 2024-04-28 19:12:50 · 612 阅读 · 0 评论 -
C++笔试强训day11
所以从第二天开始遍历,只要prices【i】 > prices【i - 1】就可以加到利润中去(当然你也可以一开始读取整个句子,逆置这个句子后,再去句子里将每个单词逆置。我的做法是用vector存储这些string然后逆置,方便高效且快捷。一开始很多人想的肯定是贪心,但是最后总会有几个样例过不了。细节:可多次卖出,但购买前必须卖出之前的。原创 2024-04-30 14:40:56 · 572 阅读 · 0 评论 -
C++笔试强训day12
则第i个位置的sh个数则为(i - 1位置的sh个数)加上(i - 1位置的s个数 * 1个h)。我的思路是找出长度差值,然后让长的先走差值步数,这样就可以让他们同时出发,我做的题目太少了,最多就做过两个状态的dp,结果就没有考虑dp方面。正解为多(3)状态dp问题,处理好初始化细节就可以。暴力枚举就行,也可以用哈希表,哈希更省一点时间。y[i] : 前 i 个数有几个shy。s[i] : 前 i 个数有几个s。h[i] :前 i 个数有几个sh。比如前i - 1个位置有n个s,mari和shiny。原创 2024-05-01 23:27:19 · 1133 阅读 · 1 评论 -
C++笔试强训day13
如上图,若是多出一个C,必然不可能重排,即C的数量 >(n + 1) / 2的话,直接输出noi就行了。简单逻辑题,按照题目意思模拟就能过。找到填入规律就很好办,先。原创 2024-05-04 21:17:01 · 515 阅读 · 0 评论 -
C++笔试强训day14
据题意描述就是每次都取中间的值为水平值,所以我们可以。(注意,需要先排序,因为这样才能得到第二大的值)原创 2024-05-04 21:35:07 · 418 阅读 · 0 评论 -
C++笔试强训day15
返回值则是g <= m, 因为大于m就不满足题意,小于m的话可以通过无限分组(拆开那些同一个声部)来实现。3.BFS遍历,取数出来 cout 然后,将该数连接的线去除。因为n是 >= m的,将n完全拆开是肯定可以拼凑出m组的。同时若出现入度为 1 的数,接着存入队列。一道拓扑排序模板题,了解过拓扑排序就能很简单写出来。数学找规律,找离 x 最近的完全平方数 y。从左往右遍历大数据很有可能超时,这时就要去。2.将入度为 0 的数存入队列。,因为求的是最多小组人数。原创 2024-05-08 22:37:13 · 520 阅读 · 0 评论 -
C++笔试强训day16
一个检查是否为质数的函数,一个检查是否为神奇数的函数。我的思路是遍历所有长度为n的子串,找到比例最高的一串。替换完之后别忘了后面的剩余字符。然后for循环遍历数组即可。注意细节:不要出现前导0。类似固定长度滑动窗口。原创 2024-05-10 09:31:04 · 485 阅读 · 0 评论 -
C++笔试强训day17
存储快乐值和羞耻度的前缀和,然后快乐值总和 sum1 = h[r] - h[l - 1];羞耻度总和 sum2 = s[r] - s[l - 1];注意:要开long long,因为数据量太大。然后一遍一遍更新出maxh和mins和L即可。简单把他当成字符串遍历即可。原创 2024-05-11 16:09:20 · 469 阅读 · 0 评论 -
C++笔试强训day18
比较规则是:首先比较第二个元素的值,如果它们不相等,则按照第二个元素的值从大到小排序;2.当数量超过 9 时,需要逐个拿出 n 的位数,如153次,需要拿出1、5、3三个数。,则按照第一个元素的值从小到大排序。1.数量为一个时不用输出个数。原创 2024-05-11 17:09:52 · 582 阅读 · 0 评论 -
C++笔试强训day19
我们可以从两边开始(一个下标为0, 一个下标为 n - 1)开始遍历,如果一路遍历下来,所有的。模拟就行,唯一可能是难点得就是gcd(最大公约数)中都有相同的字符,则返回Yes,若有一个没有则No。动态规划 - 路径问题。原创 2024-05-12 17:07:46 · 354 阅读 · 0 评论 -
C++笔试强训day20
若从0和n - 1往中间遍历,存在不相同,即可直接break返回 n (个数)。即这时个对称数,但是如果你取除第一个或最后一个外的所有字符,即可组成非对称。我认为这就是一道数学分析找规律题,暴力强解复杂度太高,易超时,解不出来。dp[i], 以i为结尾,可以表示的最大数值。除完之后有无余数,若有,则还可以再挨一次打。填完表后,遍历一遍表中的数,取出最大值即可。题目有要求要最大,所以为 n - 1。若全相同,则返回 n - 1。若字符全相同,则返回0。经此一役小红所向无敌。原创 2024-05-12 17:31:22 · 378 阅读 · 0 评论 -
C++笔试强训day21
方法一:一开始我想复杂了,其实用试错法去试(试多几种方法),最后发现可以直接交换该数和其后面的一个数即可。哈希表存储,从1 往 n 遍历,只要cnt[i]!= 0,就存入ret(数组)。简单叙述就是每个数的左右两边不能一个比他大,一个比他小。反之,就是要让每个数的左右两边数都大于或者都小于他。利用set的特性,直接读入,然后打印。一道动态规划 - 区间dp题目。放个⼩的之后,再放个⼤的。最后遍历数组打印即可。原创 2024-05-14 16:00:53 · 462 阅读 · 0 评论 -
C++笔试强训day22
更好求解,最后返回时返回V - dp[n][V]即可。遍历所有符合条件的匹配方法,找出。判断是否为2的n次方就好了。原创 2024-05-14 17:17:39 · 453 阅读 · 0 评论 -
C++笔试强训day23
将排序后的每个string扔进去,直接返回它的size即可。原创 2024-05-15 19:47:18 · 703 阅读 · 0 评论 -
C++笔试强训day24
我的思路是构建二维前缀和,然后再遍历所有的子矩阵,但是我遍历子矩阵有错误,没遍历到全部,所有一直过不了。固定滑动窗口,每次都遍历长度为n / 2的窗口。判断是不是平衡⼆叉树。原创 2024-05-15 20:58:47 · 591 阅读 · 0 评论 -
C++笔试强训day25
我以为这个数组本就是有序的,所以直接开始遍历了,还导致找不出错在哪,这道题得先排序,再遍历。将题意变换为求是否能。原创 2024-05-16 16:54:12 · 559 阅读 · 0 评论 -
C++笔试强训day26
dp[i][1] 等价 f[i]dp[i][0] 等价 g[i]当然,也可以用二分来遍历。原创 2024-05-16 17:37:24 · 476 阅读 · 0 评论 -
C++笔试强训day27
【代码】C++笔试强训day27。原创 2024-05-17 23:02:38 · 555 阅读 · 0 评论 -
C++笔试强训day28
DFS枚举就行,注意其中回溯、剪枝和返回等细节即可。另一种常规解法为树上dp动规。原创 2024-05-18 23:03:42 · 388 阅读 · 0 评论 -
C++笔试强训day29
数学规律加上一点贪心(原创 2024-05-20 19:43:54 · 635 阅读 · 0 评论 -
C++笔试强训day30
两个数组之间的dp问题,主要是能搞清楚状态表示,后面就好思考了。数学找规律题,注意开long long即可,因为数据太大。原创 2024-05-22 16:30:26 · 636 阅读 · 0 评论 -
C++笔试强训day31
1.当全都选二人船时,最后有余数(即剩下一个人),大部分人都是分两种情况,要么他坐二人的,要么坐三人的,但是还有另一种情况,根据题意便可知,每次都要去取出目前让自己舒适感最低的口罩,所以可以用优先队列来实现。2.同样,都选三人船时,最后有余数,前面博客有类似题目 - 》(原创 2024-05-24 13:26:38 · 993 阅读 · 0 评论 -
C++笔试强训day32
然后若 i 的开始时间小于 end,则更新end = min(end,i的结束时间),{取最小值的原因是贪心(要选择尽可能多的活动数量)}很细节的一个地方是他的初始化,因为你不确定有没有负数,若是默认初始化(0),则会导致一个全为负数的数组中返回 0 ,这样是答案错误。现将其转化为回文数(这里用字符串存储比较方便转化),然后判断是否为素数即可。若 i 的开始时间大于或等于 end,直接让活动数 +1。因为状态表示是最后一个人必须,所以我们选取返回值时,若搞清楚了该题的状态表示,还是可以做一下题目的。原创 2024-05-25 11:59:38 · 990 阅读 · 0 评论 -
C++笔试强训day33
若一个数从0 - > 1,那么则cnt++(cnt是窗口中字母的种类),若从1 - > 0,那么则cnt--。当cnt > 2时,就得出窗口了。然后就是找个合适的位置更新返回值。原创 2024-05-26 16:15:02 · 869 阅读 · 0 评论 -
C++笔试强训day34
DFS:(我写的DFS目前还是没找到为什么有测试用例过不去)BFS / DFS(宽度 / 深度 优先遍历即可)BFS:(因为可以保证第一次找到的一定是最近的)提取题意,模拟一下即可。原创 2024-05-27 19:01:13 · 712 阅读 · 0 评论 -
C++笔试强训day35
b[j]时,在这三种情况中取最小值即可,因为有重复,所以可以简化,最后变为。根据这个规律,找到最后⼀次删除的起始位置的下标即可。,一开始我就看错了题目,直接双指针搜索了。当然,也有更简便的方法:(找规律)通过⼀两个例⼦的模拟,我们发现,原创 2024-05-28 19:40:57 · 1105 阅读 · 0 评论 -
C++笔试强训day36
然后就是状态转移方程:dp[x] = f[x], (因为这时候遍历到的数就是 x,原创 2024-05-29 20:04:08 · 2662 阅读 · 0 评论 -
C++笔试强训day37
如果 A 字符串能够旋转之后得到 B 字符串的话,在 A 字符串倍增之后的新串中,⼀定是可以找到 B 字符串的。因此,我们仅需让 A 字符串倍增,然后查找 B 字符串即可。原创 2024-06-01 15:37:56 · 963 阅读 · 0 评论 -
C++笔试强训day38
dp[i][j] :从前i个中挑选,总和 % k == j时,最大总和为多少。有了这几点,状态转移方程就非常好推了,只需要注意一下非法值的初始化即可。一开始都可以想到将数组的前x个数拿出来排降序输出第二个数即可。因此就可以推出前一个状态为的 j 为 j - a[i] % k。1.顺时针旋转180° -》列对称一遍再行对称一遍。即(j - a[i] % k + k)% k(又因为可能会出现相减之后出现负数,因此可以用。2.关于行镜像 -》如题意一样,行对称即可。原创 2024-06-04 21:23:43 · 883 阅读 · 0 评论 -
C++笔试强训day39
看输出描述即可知输出次数最多的那个字母即可。即为哈夫曼编码:与该篇中的模版题极为相似-》当然,也可以进行空间优化。搞清楚他的状态表示{原创 2024-06-05 20:13:47 · 1289 阅读 · 0 评论 -
C++笔试强训day40
最后去最小值即可。原创 2024-06-06 17:25:48 · 1339 阅读 · 2 评论