- 博客(19)
- 收藏
- 关注
原创 DFS深度优先搜索
在寻路问题中,"递"就是向前走一步,"归"就是后退一步。"归"的条件要么是无路可走了,要么是这条路上的点已经走过了,走过的路径形成了环。为了记录走过的路径,我们需要一个vis数组来辅助记录。为了减少对边界问题的讨论,我们规定迷宫左上角为(1,1)。DFS是一种用于遍历或搜索树或图的算法,它从根节点或起始节点开始,首先访问所有可到达的节点,然后对于每个可到达的节点,再递归地访问其未访问过的相邻节点,直到所有节点都被访问为止。如果要记录多条路径呢?还有些非路径题目也可以用dfs。
2025-02-16 21:52:58
422
原创 归并排序及例题
归并排序的过程:首先将数组中每个元素都看成一个有序序列,即形成了n个有序序列;然后将这n个有序序列两两归并,1和2归并,3和4归并....得到[n/2]个长度为2的序列(最后一个长度可能为1);再按照前面的步骤归并;这样可以大大减少时间复杂度。先通过递归分解数列,再合并数列就完成了归并排序。
2024-12-12 18:35:16
248
原创 八皇后 Checker Challenge洛谷
由于n的范围比较小,所以我们可以考虑递归枚举,通过枚举每行放的位置,检查它是否列冲突的,或对角线冲突。
2024-12-07 15:20:34
201
原创 位运算知识点
按位异或的特点:若a^b=c,则b^c=a,且a^c=b.按位异或可以进行简单的加密和解密,即可以将b作为加密和解密的密钥,对a进行^b操作再发送出去,接收处再通过^b解密。当k不为1时,因为美味程度从1到n不等,所以在这个区间总会存在一个数是n的取反数,它们两个的按位异或操作最大,因为二进制位都为1,所以答案为n的最高位+1的二进制数减1。| 的常用功能:对一个数的二进制某些位定值为1.例如想将一个数的低四位设置为1,只需将该数与15进行按位与操作即可(15的二进制为0000 1111)
2024-12-03 16:56:22
1519
原创 兔子数 洛谷P1362
可以观察到L和R的1值超级大,如果不缩小枚举数的值域必然超时,所以我们思考如何减少枚举的值域。这时我们观察到若x的某一位大于3,则平方后会进1,于是s(x*x)必然会变小,所以我们不希望它进位,所以它的每一位数都为0,1,2,3,一旦超过三就跳过去,即逢4进1,进位使我们检查完23后直接从30开始,大大减少了枚举的值域!
2024-11-26 17:52:21
265
原创 [蓝桥杯 2019 国 C] 数正方形
那么问题转化为了求四个顶点都落在i*i正方形边上的正方形的个数。易知四个顶点落在大正方形边上会形成四个直角三角形,设直角边长为a,b.则a+b=i,而0<=a,b<=i;且a=0或b=0情况一样,注意!而边长为n的正方形中有。我们来分开处理一个i*i大正方形的情况。个边长为i的正方形。
2024-11-26 16:19:01
305
原创 枚举法(内含三连击(升级版)和连续自然数和题解)
这道题符合每一个使用枚举法的条件,且思路也基本吻合:易知这个和可以由等差数列求和的方式求出:m=(a1+an)*n/2,即m*2=(a1+an)*(an-a1+1);我们可以枚举一个数字i来控制输出数的大小而i的值域为1到1000/c,如果i大于1000/c,则c对应的那个数字就超过了1000,不符合题意。枚举算法的时间复杂度可以用状态总数*考察单个状态的好事来表示,因此优化主要是:(1)减少状态总数(即减少枚举变量和枚举变量的值域)。枚举法的特点:1.算法相对简单,容易理解,是最容易想到的方法。
2024-11-26 15:25:35
846
原创 快速求幂(在O(logb)的复杂度下算出a^b的值)
普通的利用pow计算a^b时,会使a乘以b次自己,当b非常大时就会非常慢。这时我们想到可以把b分成好几份,每一份大于1,这样就可以大大减少复杂度。,于是将底数3平方,再进行三次乘法就可以得出答案,将原本八次乘法转化为三次乘法,大大减少了时间复杂度!,我们可以把8写成二进制形式1000,即。
2024-11-26 13:51:12
223
原创 brightness begins CodeForces - 2020B (依然是二分查找)
对于每个i=1,2,3,..,n,要反转每能被i整除的灯泡j的状态。所以灯泡的最终状态取决于灯泡j的因数,例如灯泡6的因数是1,2,3,6,因数个数为偶数,所以最终状态为偶数。所以,总得来说,一个灯泡最终状态为开启的条件是它的因数个数为偶数。而一个数只有是完全平方数时,它的因数才为奇数。所以,要找到n,只需找到一个。例如样例2,k=3.设灯泡亮为1,灭为0.
2024-11-22 20:51:58
245
原创 将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序),问有多少种不同的分法?
所以f(n,k)=f(n-1,k-1)+f(n-2,k-1)+...+f(n-i,k-1)...一直加到n-i>=i*(k-1)为止。因为每个当继续按照以更大的数字 i+1开头来枚举分法时,如果剩下的数 n-i已经足够按照每份至少为 i的要求分出 k-1 份,那么就不需要再继续枚举更大的开头数字了。这道题可以根据枚举不同数字开头来计算分法数量。
2024-11-22 20:06:10
510
原创 递归与递推
但递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以栈内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。这道题就可以用a[i][j]+=a[i-1][j]+a[i][j-1]来做,因为a[i][j]可以由a[i-1][j]和a[i][j-1]走到,所以把有路障的点标记为零,其余点依照公式相加,最后的a[n][n]即为答案。它通常把一个复杂的大型问题转化为一个与原问题相似的规模较小的问题,可以极大的减少代码量。
2024-11-22 18:45:36
530
原创 二分查找(折半查找)(内含CodeForces - 1760F )
在数组中想要找到一个元素,我们最先想到的就是遍历数组,用if语句判断它们是否相等,但时间复杂度太高,我们也不想遍历数组中的每个元素,感觉太麻烦了。当题目让你去找一个答案,这个答案满足条件A,让你去求answer的最大最小值,如果没有具体公式,我们求解起来还是非常困难的,如果answer还具有单调性,我们不妨直接用二分查找,测试它是否满足条件,如果满足条件,继续二分,看它是不是最值。v元素的最小元素的指针)。这些数组都是有序数组(从小到大),如果数组是无序的,使用二分查找之前时一定要先进行排序。
2024-11-19 14:42:28
672
原创 一维差分和二维差分
所以,我们引入一个差分数组b:b[1]=a[1],b[2]=a[2]-a[1],b[3]=a[3]-a[2]...b[n]=a[n]-a[n-1],b[n+1]=a[n+1]-a[n];那么二维数组的差分就可以写成diff[i][j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];转换回来:a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+diff[i][j];(n,m<1000)
2024-11-15 20:40:20
465
原创 Fibonacci的三种写法
然后改进第一种方法,可以将每个n对应的结果都储存在一个栈中,这样就不用每次都调用,大大减少了时间复杂度。首先能想到的就是最简单的递推,但非常耗时。最后一种方法不用递归,可以用个循环来做。
2024-11-15 19:23:30
378
原创 联系多对数组,用结构体
因为我们需要最小权重,所以我们需要先进行权重排列,再进行坐标排列前n*2个数组。我们需要三种排列方式,分别是坐标排列,权重排列以及隐含的输入顺序排列。我们需要使逆序和最小,而且一行中的两个数相联系。可以观察出当a+b<c+d时逆序和最小。
2024-11-15 19:12:55
174
原创 第一年有一头母牛,母牛第四年成年后每年生一头母牛,问n年后有多少头母牛
前三年,牛的数目都为一。今年时大前年出生的牛成年,可以开始生小牛。所以可以设f1为去年的牛数,f2为前年的牛数,f3为大前年的牛数,f4为今年的牛数。所以今年的牛数就等于去年的加上大前年牛的,即f4=f1+f3;然后前年成了大前年,即f3=f2;去年成了前年,即f2=f1;今年成了去年,即f1=f4;
2024-11-14 17:54:26
183
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅