栈的补充——单调栈 首先我们来看看单调栈是怎么定义的一、栈中的元素从栈顶到栈底是单调递增的,这样的栈就是单调递增栈二、栈中的元素从栈顶到栈底是单调递减的,这样的栈就是单调递减栈怎么样,定义是不是很简单,其实他实现起来也一样简单。
暑假集训 |第三周训练总结 不过也还好,主要是将知识点的时候有点,因为毕竟是新东西,要花时间吸收也正常。这周让我感觉最大的不同就是周末讲台讨论的时候,之前讲题的时候感觉很枯燥很困,不过这周有互动之后,精神好好不少,就是感觉有些题的难度比较大,其中用的东西也没学过,听不太懂,不过能理解解题思路是算有收获。下周的大致规划,因为周末要打睿抗的比赛,所以,下周肯定是要花点时间去做做以前的题,而且得把二分和搜索的知识复习一下。周一到周二补齐动态规划的总结,周三周四花时间复习之前的知识,然后剩下几题就是准备睿抗。这是这周动态规划专题的题解。
线性DP和背包问题 对于递归和地推我们以斐波那契数列来举个例子斐波那契数列的定义是这样的 f1=1, f2=1,fn=fn-1 + fn-2;根据这个定义,我们可以很容易的用递归实现,代码如下用递归进行实现的过程会出现一个什么问题呢?就是,这是什么意思呢,举个例子我们要去求斐波那契数列的第5个数我们会调用:去求第4个和第3个数我们会调用:去求第3个和第2个数,以及去求第2个以及第1个(后面这部分调用结束,返回)我们会调用:去求第2个和第1个数(调用结束,返回)
暑假集训 | 第二周训练总结 这周的训练主要就是补上一周的堆栈队列专题和这周的搜索,以前搜索不怎么会,这一周的练习之后稍微会了一点,不过真就只是会了一点……除了专题的学习,这周训练的比赛时候的状态真的是太差了,以前都会做到最后一秒,即使早知道做不出来也不会摆,这周有两次真是直接开摆了。除了这两个知识之外,也是稍微学习了一下图的知识,说来好笑,已经过了这么久了,我还不会图。我和其他的人的差距确实还是很大呀,虽然不能操之过急,但差距摆在这,就是还得练。这一周的训练整体下来的感觉也还不错,就是不知道为什么经常犯困,难道是晚上睡得太晚了。
图的分类和使用 使用矩阵去存储有向图时,其优点在与,访问两点直接是否有连线,以及连线方向如何是非常容易的,但其空间复杂度会非常大。为什么非常大呢,我们可能看一下首先,我们需要去开一个二维数组,二维数组开多大,取决于我们到底有多少个点,比如我们总共有n个点,则我们需要开一个 a[ n ][ n ] 的数组,这里是假设我们下标从0开始;如果下标从1开始的话,我们则需要开一个 a[ n+1 ][ n+1 ] 的数组然后我们去确定这个数组里的每个元素,其确定方式是这样的:如果。
搜索(深搜DFS和广搜BFS) 在学习深度优先搜索和广度优先搜索之前,我们先了解一下什么是搜索搜索其实就是一个通过不同的试探去找寻我们所需要的解的一种方法,什么是不同的试探呢?不同的试探就是尝试不同的路径直到找到我们所需要的那条路径。
第二周训练题解(7.16-7.21) SMU Summer 2024 Contest Round 4(7.16)-CSDN博客SMU Summer 2024 Contest Round 5(7.19)-CSDN博客2024 暑假友谊赛 2(7.20)-CSDN博客
SMU Summer 2024 Contest Round 4(7.16) 我们把红苹果中最大的X个和绿苹果中最大的Y个取出来,存入一个新的数组ab中,然后我们对数组ab进行从小到大的排序,再然后我们先对数组c从小到大排序,找到替换后的最大sum1 ,再将数组c从大到小排序,找到替换后最大的sum2,比较sum1和sum2,取最大值。就是给你红、绿、无色三种颜色各A、B、C个,每个苹果都有他的美味程度,然后你可以选X个红苹果,Y个绿苹果,你在选红苹果和绿苹果时也可以用无色苹果代替他们,然后题目要你求出选取X个红苹果和Y个绿苹果后的最大美味程度。会和我一样T掉,哈哈,包超时,老弟。
SMU Summer 2024 Contest Round 5(7.19) 当我们排好序了之后,我们可以设一个l 和 r ,l 表示当前点往左的小于当前点体重的小孩的人数, r 表示当前点及往右的大于等于当前点体重的大人的人数。所有我们的思路就是开一个数组a,每输入一个k数,如果当前数组中的个数大于等于k个,那么去遍历当前数往前的k-1个数,看是不是都是k,如果存在不是k的数那么数组a 下标ai++,然后去读入下一个数,如果都是k ,那么把数组a 的下标往前以 k位,再ai++题目要求的是什么呢?题目要求的是读入当前的k 后,之前输入的(包括刚刚输入的数)总共还存在多少个。
2024 暑假友谊赛 2(7.20) 但如果执行过操作1,那我们在执行操作2时,就需要进行判断了,如果这是执行完操作1后第一次执行操作2,那么我们完全可以将操作2的目标元素直接赋值为x 加上操作2需要新加的值,但如果这不是执行完操作1后的第一次操作2,那么我们就需要用目标元素的值加上需要新加的值,而不是直接赋值为x 加上操作2需要新加的值。对于这道题,我们只需要进行模拟就可以完成,但在执行每次的要求操作时,需要注意的是,对第一种操作的处理,如果我们单纯的用一个循环去将数组的所有值都赋值为他给的x ,显然我们将会得到一个超市的代码。
暑假集训 | 第一周训练总结 第二周的安排的话:一个是第四章那个堆栈队列专题的学习和那个专题练习,下一周应该还会发新的专题练习,尽量的话,还是在下午的下半段时间(如果没有训练的话)和晚上回寝之后练习,补体的时间尽量放在下午的上半段时间,晚上的话有比赛的情况要留足时间打比赛,而且比赛之后的那天晚上就负责补题。但另一个专题的训练我确实是有点没跟上进度,还得抓紧一点时间。个人感觉专题训练对自己的提升确实是非常显著的,不过感觉自己在训练的时候总是注意力不太集中,容易走神,不知道是因为什么,可能是睡得比较晚,之后的作息要注意。
二分专题训练 但二分什么我没想懂,后面看了别人的思路才知道,是要利用分治的思想去处理,即每个区间的总的位数差=左边区间的总的位数差+右边区间的位数差+左边区间的每个数相对右边区间来说的位数差(这里用二分函数去找,速度快)题目大意:就是给你一个n个元素的数组,把数组中的每个可以取第k大数的区区间中的第k大的数取出来构成一个新的数组,然后求新的数组里第m大的数尽可能大能是多少。之后用二分思路做是这样的,对结果进行二分,然后所假设的结果的值进行验证,如果可以就再放大假设的值,不可以就缩小。这道题其实和上一题一样是01分规划。
二分算法的使用 差分数组和 前缀和 一样,是通过对 原数组 进行数学运算得到的 新数组, 前缀和的定义规则是这样的:我们先假设一个原数组 arr[5]={1, 3, 5, 7, 9};那么我们可以定义一个前缀和数组 q[5]={1, 4, 9, 16, 25};这个数组是如何定义实现的呢?其实是这样的:当 i!= 0 时;if(i==0)else而差分数组的定义规则是这样的:依然我们先假设一个原数组 arr[5]={1, 3, 4, 7, 10};