
杂项(包括但不限于其他模块的内容)
一些快速OI的技巧
&不白熊
一头不白熊
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法常用模板
数据结构:包含一些常用的算法模板。原创 2024-09-10 11:39:27 · 383 阅读 · 0 评论 -
柳婼的书库
链接: https://pan.baidu.com/s/1TvpqJitd1ukZ7St3o4ZNEg 提取码: 1234。除了有基本实在找不到的(实际上就使不包括java和人文)原创 2024-08-29 21:53:56 · 340 阅读 · 0 评论 -
倍增基本思想
那么兔子所有可能条的位置为:(1 * 2 ^ 0)(1 * 2 ^ 1)(1 * 2 ^ 2)(1 * 2 ^ 3)……因为每次跳过的距离都是(1 * 2 ^ 0)(1 * 2 ^ 1)(1 * 2 ^ 2)(1 * 2 ^ 3)每个值相当于多次跳过最小距离(1),也可以说是最小距离的倍增,所以一定能到达。有一个兔子,x到y的距离未知,从x最快跳到y的策略是什么。兔子只能一步一步的跳,然后判断是否到达 y 点,跳 2 ^ 3 而不是 2 ^ 4。原创 2024-08-14 19:55:26 · 318 阅读 · 0 评论 -
Kahn拓扑排序
的所有顶点的线性序列。原创 2024-08-13 15:03:31 · 494 阅读 · 0 评论 -
查找所有质因数
这时:数有两种情况(质数,合数),当还是合数时,依然能通过e%i去除质数的乘积值,当是质数时,会走到算法的最后一步。while(num % i == 0) num /= i这一步直接去除了被合数整除的情况,所以不需要判断i是否为质数。所有的合数都可以由一些质数相乘得到,while(num % i == 0) num /= i是为了去除。而得到的所有i都是质数是因为:e%i==0当i是合数的情况是由。1,去除小于2的数字,因为0,1或者负数,因为最小的质数是2。为什么得到的所有i都是质数?原创 2024-08-07 17:17:28 · 475 阅读 · 0 评论 -
ICPC图谱
来自:原创 2024-08-07 19:56:59 · 138 阅读 · 0 评论 -
生成斐波那契数列
在数学上,这一数列以如下。的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)——来自百度百科。因为:F(0)=0,F(1)=1,所以可以将任意n递归成F(n - 1)+F(n - 2)直到n == 0或1,就可以求出值了。基本公式为F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),可以利用这个公式用递归写出斐波那契数列。斐波那契数列(Fibonacci sequence),又称黄金分割数列 [1],因数学家莱昂纳多·原创 2024-07-22 11:37:35 · 280 阅读 · 0 评论 -
前缀和遍历数组从arr[i]到arr[j]的和
x1,x2,x3,x4,x5的前缀和为 0,x1,x1+x2,x1+x2+x3,x1+x2+x3+x4,x1+x2+x3+x4+x5。那么第2项到第4项的和就是arr[4] - arr[2-1]的值,注意尾部元素需要-1,这就是为什么需要以0开头。用这种方法就可以遍历数组 i - j 项的和来进行一些特殊操作了。可以用计算前缀和的办法来遍历从arr[i]到arr[j]的和。题目中需要判断从arr[i]到arr[j]是否可以被买。注意第一个元素需要是0,这样前方便计算i-j项的和。前置和为到该元素为止的。原创 2024-07-22 11:02:18 · 181 阅读 · 0 评论 -
判断数字组成问题(凑数的问题)
但是如果从最大的开始遍历的话,如果减去已经遍历的数字发现数字太大了就可以跳过了,极大提高了效率。如果从最小的判断的话,只能遍历,无法判断数字是否能用上。应该从最大的数字开始判断,是因为。判断一个数字是否能由一系列数字。原创 2024-07-21 23:15:07 · 239 阅读 · 0 评论 -
时间规划问题
因此将任务的结束时间排序,每次选取最小的任务即可。在处理这种问题时,要观察对结果影响最大的因素。后续的时间剩的越多,能处理的任务就越多。原创 2024-07-21 22:57:10 · 184 阅读 · 0 评论 -
有关分层算法
有体重1-100的10个人,根据体重将他们分类,类为10的倍数,最小的类的10,每次递增10,以此类推,体重相同的人类相同。2,根据left和right最大的值max得出层数为:10 + max*10。2:遍历元素,用数组left和right存储左右两边符合分层需求的权值。1,用left[],和right[]存储左右两边符合分层需求的权值。根据左右两边的元素大小动态调整自身大小。1:将元素分层(最大值,最小值)3:根据最大的权值和分层规划结果。3,按照具体题目输出结果即可。适用于经典的分层问题例如。原创 2024-07-21 22:40:23 · 273 阅读 · 0 评论 -
判断是否为整数
(将num中的整数存储到b中,小数存储到a中)升幂查看,注意只能查看一位小数,如果增加幂次也只能查看最后一位数字。原创 2024-07-20 08:05:20 · 289 阅读 · 0 评论 -
希尔排序(Shell_sort)
希尔排序虽然看着多了跟多步,但是在大数据的情况下要比单纯的插入排序快上不少。希尔排序常用于插入排序的数据预处理,用于提升插入排序的大数据处理速度。将i初始值改为1,然后j循环所有的1改为n即可。将插入排序的函数改为n递增即可使用希尔排序。原创 2024-06-10 13:46:41 · 444 阅读 · 1 评论 -
计数排序(Counting_sort)
哈希函数编号为数字,值为数字出现次数,例如hash[3] = 4表示3出现了4次。寻用哈希思想将数存储在一个哈希数组中,然后遍历哈希数组进行排序。首先构建哈希函数,并将初始值设置为0。然后遍历一次使数组进行排序。原创 2024-06-10 12:50:00 · 219 阅读 · 0 评论 -
堆排序(Heap_sort)
该函数只能使一个头节点的元素最大,需要从最小的父节点进行循环,因为如果从下往上的话最大的数传播不上去;在主函数后续只需要排序一次是因为:只有头节点不满足大根堆,相当于第一次的最后一步,也就是排序最后一个头节点,因此只需要排序一次即可构成大根堆;然后将首节点与最后节点交换,因为大根堆的头节点最大,这时候最末尾元素就是最大的了。然后在用heap一次即可找打剩余最大的数字持续交换直到剩下最后一个元素即可。父节点的子节点为son = dad*2+1 或 dad*2+2。有父节点大于所有子节点。原创 2024-06-09 20:33:36 · 395 阅读 · 0 评论 -
快速排序(Quick_Sort)
先用一个变量t存储元素,从左右两端循环,因为排序的元素是最左端元素,所以应该先从右侧开始,如果遇到了小于t的元素,就将左侧覆盖为他,接着从左端开始,如果遇到比t大的元素就将他覆盖到右边,直到low == hight;这个时候的位置就是左侧数都小于t,右侧数都大于t,将t插入后返回即可。每次排序一个元素,每次使他的左边都比他小,右边都比他大;先排序low位置的元素。然后返回他排序后的位置。接着排序他左边和右边。递归直到只剩一个元素。原创 2024-06-09 20:06:31 · 685 阅读 · 0 评论 -
选择排序(Selection_Sort)
最最最最最最最最最最最最最最简单的一种的排序,没有任何的门槛和技术而且思想十分简单。每次循环选择最小的元素交换。原创 2024-06-09 19:43:20 · 253 阅读 · 0 评论 -
冒泡排序(Bobble_sort)
从最尾端开始比较,如果元素小就交换,就像这样将最小的元素像冒泡一样顶到最上面。原创 2024-06-09 19:36:48 · 301 阅读 · 0 评论 -
归并排序(Merge_sort)
递归结束条件是low < hight,也就是最小为2的数组,而如果数组总长度小于1就会不做任何排序。主要函数是将两个分开的数组排序成一个数组,需要两个指针指向两个数组开头,每次排列进去最小的数字;两个排序完后排序四个的,逐步递归,直到完成最开头的Merge函数,排序结束。递归函数的作用是将数组按顺序拆分为两个两个的好多对数字,(两个指针指向两个数组开头,每次排列进去最小的数字);将一个数组拆分为许多个两两结合的数组,然后逐步排序。将这两个数字看作一个数组,和另一对数组排序。需要递归函数和归并函数。原创 2024-06-09 19:06:30 · 395 阅读 · 0 评论 -
插入排序(Insertion_sort)
基本思想就是从第一个元素开始,每次排列一个元素,一直排列到结尾。因为3小于4所以直接结束循环,将4的位置还是赋值给4。就这样一直覆盖,直到找到比1小或者到最开头为止。接着排序2,这里直接写出排序2的步骤,自行理解。因为3 > 1所以直接将3覆盖到1上。然后结束循环的位置就是这个元素的位置。第一个元素不用排序,从第二个开始。结束循环位置是0在,则赋值为。而1用一个变量先存储着。然后排序5和7也是一样。原创 2024-06-09 17:41:33 · 484 阅读 · 0 评论 -
四舍五入问题
而将数四舍五入赋值给变量可以用round()函数。但是这么些只能转换位四舍五入的整数。表示将num四舍五入赋值给a。但是这个方法有时候会出错。代表输出n位四舍五入小数。这样就可以精确两位小数。单纯输出四舍五入可以用。原创 2024-06-08 22:49:57 · 449 阅读 · 0 评论 -
Dijkstra算法(迪杰斯特拉算法)
3,进入循环,每次寻找dis中最小的节点,然后遍历邻接表,如果邻接表的距离+该点的dis < dis[循环到的点],那么就迭代循环到的点,最后将最小的那个点check设置为true。而迷宫的最短路径可以用BFS来做,虽然BFS不能用于带权值的迷宫,但是可以对BFS稍微改进,只需要把判断是否走过的数组改为最短路径的数组,在判断是否可走时判断是否比最短的小即可。1,初始化一个graph二维数组来存储图的邻接表,一个dis一维数组来存储最短路径,一个check来存储是否走过。也可以直接写一个函数判断。原创 2024-06-07 13:11:39 · 624 阅读 · 0 评论 -
DFS(深度优先搜索)
2,然后判断各个方向是否能走,如果能走则将arrB设置为1,然后递归DFS(可走的方向,step+1)然后将arrB设置为0,因为要回退,就是把走过的点重新设置为未走过。1,从头结点开始,如果为终点,则迭代min,然后回退(无论是否未终点都需要回退,因为已经无路可走)跟BFS不同的是:DFS优先沿着一个节点走,直到走到结束点,而BFS同时走多个节点;DFS和BFS一样,只能用于个节点权值相等的情况。原创 2024-06-07 09:29:01 · 452 阅读 · 0 评论 -
BFS(广度优先搜索)
3,判断头节点是否为出口并迭代min,将对列头节点可走的点入队。也可以直接通过pair使用。而如果5和4的权值为1其他为无穷大,则无法找到最短路径。而当权值相等时则不会出现这样的问题,因为2和4就等价了。需要注意的是个点的权值必需相等,否则会出现坏路的情况。然后将入口入队,并设置入口走过(arrB = 1)min记录最短步数,初始化为无穷大。当入队1时,通过1入队2,4;BFS常用于最短路径求解;5,重复3,4直到队列为空。构建arrA存储迷宫,然后通过2入队3,5。原创 2024-06-07 09:11:39 · 358 阅读 · 0 评论 -
判断素数/质数
网上找了一圈没发现了一个优化的点:即大于5的素数都在6的倍数的两侧,如5,6,7,5和7就是素数11,12,13,11和13就是素数,但是在6的倍数的两侧的不一定是素数,因此还需要判断一次。优化后运行速度提升了一个档次。原创 2024-06-06 22:26:12 · 416 阅读 · 0 评论 -
求最小公倍数
因此可以通过之前的gcd公式求出最小公倍数。原创 2024-06-06 21:50:41 · 361 阅读 · 0 评论 -
求最大公约数
而a和a%b的最大公约数又等于a%b和b % (a%b)的最大公约数,一直循环直到b=0;又因为a%b > b % (a%b)恒成立所以b比a小,所以b先=0;a,b的最大公约数等于(a或b)和a%b的最大公约数;原创 2024-06-06 21:30:26 · 262 阅读 · 0 评论